Я пытаюсь преобразовать DataTable в файл XLS.
Код ниже
Snippet1
Response.Clear();
Response.Buffer = true;
Response.AddHeader("content-disposition","attachment;filename=New.xls");
Response.Charset = "";
Response.ContentType = "application/vnd.ms-excel";
StringWriter sw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(sw);
for (int i = 1; i < gvGridView.HeaderRow.Cells.Count; i++)
{
gvGridView.HeaderRow.Cells[i].Text = Table.Columns[i - 1].ColumnName;
}
for (int i = 0; i < gvGridView.Rows.Count; i++)
{
//Apply text style to each Row
gvGridView.Rows[i].Attributes.Add("class", "textmode");
}
gvGridView.RenderControl(hw);
//style to format numbers to string
string style = @"<style> .textmode { mso-number-format:\@; } </style>";
Response.Write(style);
Response.Output.Write(sw.ToString());
Response.Flush();
Response.End();
Этот код выглядит нормально. Это произвело файл xls. И это можно открыть правильно. Однако я попытался перепроектировать этот процесс. Короче говоря, преобразование этого конкретного файла xls в datatable. Код ниже:
Snippet2
int idx = filen.IndexOf(".");
string tf = filen.Remove(idx, 4);
OleDbConnection MyConnection = null;
DataSet DtSet = null;
OleDbDataAdapter MyCommand = null;
//Connection for MS Excel 2003 .xls format
MyConnection = new OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0; Data Source='" + path + "';Extended Properties=Excel 8.0;");
MyCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [table$]", MyConnection);
DtSet = new System.Data.DataSet();
MyCommand.Fill(DtSet);
dt = DtSet.Tables[0];
MyConnection.Close();
if (dt.Rows.Count > 0)
{
theGridView.DataSource = dt;
theGridView.DataBind();
}
if(System.IO.File.Exists(path))
{
System.IO.File.Delete(path);
}
Этот код выдал ошибку. Это говорит:
Внешний формат файла не поддерживается
Я заметил, что эта ошибка похожа, когда вы используете неправильный поставщик OLEDB. Но в моем случае проблем не должно быть, поскольку я использую Microsoft.Jet.OLEDB.4.0 для формата .xls (2003). Но так или иначе это все еще произошло.
Этот код как-то работает для любого другого файла .xls, который я тестировал. Он не работает только с файлами, созданными в результате преобразования с использованием # Snippet1 . Однако предполагается, что я создал файл с использованием # Snippet1, а затем скопировал все ячейки в новый файл .xls. # Snippet2 будет работать против этого нового файла. Короче говоря, только файл, созданный напрямую из # Snippet1, который не будет работать.
Я подумал, что сделал что-то не так. Поэтому я надеюсь, что кто-нибудь сможет мне здесь помочь.