Преобразование DataTable необратимым? - PullRequest
0 голосов
/ 25 января 2012

Я пытаюсь преобразовать 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, который не будет работать.

Я подумал, что сделал что-то не так. Поэтому я надеюсь, что кто-нибудь сможет мне здесь помочь.

1 Ответ

1 голос
/ 25 января 2012

Ваш выходной фрагмент Excel не генерирует файл Excel. Он генерирует HTML-таблицу и устанавливает тип содержимого, чтобы сообщить компьютеру, чтобы он открывался в Excel.

Вам нужно будет использовать библиотеку для создания реального файла Excel или использовать взаимодействие данных Excel (в обоих документах много), чтобы использовать его напрямую.

Кроме того, вместо этого вы можете создать файл .csv и при этом сохранить тип содержимого Excel, чтобы Excel открывал его, но вы теряли форматирование. Затем вы можете проверить расширение, чтобы прочитать его как Excel или простой текст.

...