Как экспортировать набор данных в Excel, используя код Xml в C# Windows приложении? - PullRequest
1 голос
/ 05 марта 2020

Я получил это Error:

Исключение System.TypeInitializationException не обработано. HResult = -2146233036 Сообщение = Инициализатор типа для 'Closed XML .Excel.XLWorkbook' вызвал исключение. Source = Closed XML TypeName = Closed XML .Excel.XLWorkbook
StackTrace: при закрытом XML .Excel.XLWorkbook..ctor () при закрытом Xml .Form1.ExportDataSetToExcel (DataSet ds) в c: \ users \ test \ documents \ visual studio 2010 \ Projects \ ClosedXml \ ClosedXml \ Form1.cs: строка 41 в закрытом Xml .Form1.Form1_Load (Отправитель объекта, EventArgs e) в c: \ users \ test \ documents \ visual studio 2010 \ Projects \ ClosedXml \ ClosedXml \ Form1.cs: строка 30 в System. Windows .Forms.Form.OnLoad (EventArgs e) в System. Windows .Forms.Form.OnCreateControl () в System. Windows .Forms.Control.CreateControl (Boolean fIgnoreVisible) в System. Windows .Forms.Control.CreateControl () в System. Windows .Forms.Control.WmShowWindow (Message & m) в System. Windows .Forms.Control.WndPro c (сообщение & m) в системе. Windows .Forms.ScrollableControl.WndPro c (сообщение & m) в системе. Windows .Forms.Form.WmShowWindow (сообщение & m) в System. Windows .Forms.Form.WndPro c (Message & m) в System. Windows .Forms.Control.ControlNativeWindow.OnMessage (Message & m) в Sy stem. Windows .Forms.Control.ControlNativeWindow.WndPro c (Message & m) в System. Windows .Forms.NativeWindow.DebuggableCallback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) InnerException: System.IO .FileNotFoundException HResult = -2147024894 Сообщение = Не удалось загрузить файл или сборку 'DocumentFormat.Open Xml, Версия = 2.0.5022.0, Культура = нейтральная, PublicKeyToken = 31bf3856ad364e35' или одна из ее зависимостей. Система не может найти указанный файл. Source = ClosedXML FileName = DocumentFormat.Open Xml, версия = 2.0.5022.0, культура = нейтральная, PublicKeyToken = 31bf3856ad364e35 FusionLog ==== информация о состоянии предварительной привязки === LOG: DisplayName = DocumentFormat.Open Xml, версия = 2.0.5022.0, культура = нейтральная, PublicKeyToken = 31bf3856ad364e35 (указана полностью) LOG: Appbase = file: /// c: / users / test / documents / visual studio 2010 / Projects / ClosedXml / ClosedXml / bin / Debug / LOG: Initial PrivatePath = NULL Вызывающая сборка: закрыто XML, версия = 0.69.1.0, культура = нейтральная, PublicKeyToken = fd1eb21b62ae805b. === LOG: эта привязка начинается в контексте загрузки по умолчанию. LOG: файл конфигурации приложения не найден. LOG: использование файла конфигурации хоста: LOG: использование файла конфигурации компьютера из C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ config \ machine.config. LOG: ссылка после политики: DocumentFormat.Open Xml, версия = 2.0.5022.0, культура = нейтральная, PublicKeyToken = 31bf3856ad364e35 LOG: попытка загрузки нового файла URL: /// c: / users / test / documents / Visual Studio 2010 / Проекты / ClosedXml / ClosedXml / bin / Debug / DocumentFormat.Open Xml .DLL. LOG: Попытка загрузки нового файла URL: /// c: / users / test / documents / visual studio 2010 / Проекты / ClosedXml / ClosedXml / bin / Debug / DocumentFormat.OpenXml / DocumentFormat.Open Xml .DLL. LOG: Попытка загрузки нового файла URL: /// c: / users / test / documents / visual studio 2010 / Проекты / ClosedXml / ClosedXml / bin / Debug / DocumentFormat.Open Xml .EXE. LOG: Попытка загрузки нового файла URL: /// c: / users / test / documents / visual studio 2010 / Проекты / ClosedXml / ClosedXml / bin / Debug / DocumentFormat.OpenXml / DocumentFormat.Open Xml .EXE.

   StackTrace:
        at ClosedXML.Excel.XLWorkbook..cctor()
   InnerException:

И я использую код ниже:

private void Form1_Load(object sender, EventArgs e)
{
    DataSet ds = new DataSet();
    DataTable dt = new DataTable();
    dt.Columns.Add("Name");
    dt.Columns.Add("Country");
    dt.Rows.Add("Venkatesh", "India");
    dt.Rows.Add("Santhosh", "USA");
    dt.Rows.Add("Venkat Sai", "Dubai");
    dt.Rows.Add("Venkat Teja", "Pakistan");
    ds.Tables.Add(dt);
    ExportDataSetToExcel(ds);
}
public  void ExportDataSetToExcel(DataSet ds)
{
    string AppLocation = "";
    AppLocation = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase);
    AppLocation = AppLocation.Replace("file:\\", "");
    string date = DateTime.Now.ToShortDateString();
    date = date.Replace("/", "_");
    string filepath = AppLocation + "\\ExcelFiles\\" + "RECEIPTS_COMPARISON_" + date + ".xlsx";

    using (ClosedXML.Excel.XLWorkbook wb = new ClosedXML.Excel.XLWorkbook())
    {
        for (int i = 0; i < ds.Tables.Count; i++)
        {
             wb.Worksheets.Add(ds.Tables[i], ds.Tables[i].TableName);
        }
        wb.Style.Alignment.Horizontal = ClosedXML.Excel.XLAlignmentHorizontalValues.Center;
        wb.Style.Font.Bold = true;
        wb.SaveAs(filepath);
    }
}

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Вы можете обновить версию пакета ClosedXML NuGet с Version=0.69.1.0 до Version=0.94.2.

0 голосов
/ 06 марта 2020

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

Код:

    private void button1_Click(object sender, EventArgs e)
    {
        DataSet set = new DataSet();
        DataTable table1 = new DataTable();
        table1.TableName = "Student";
        table1.Columns.Add("Name");
        table1.Columns.Add("Id");
        table1.Columns.Add("Age");
        table1.Rows.Add("test1", 1001, 22);
        table1.Rows.Add("test2", 1005, 24);
        table1.Rows.Add("test3", 1007, 26);
        DataTable table2 = new DataTable();
        table2.TableName = "Product";
        table2.Columns.Add("ProductName");
        table2.Columns.Add("Date");
        table2.Columns.Add("Address");
        table2.Rows.Add("test1", "2020-01-01", "home");
        table2.Rows.Add("test2", "2020-02-01", "Company");
        table2.Rows.Add("test3", "2020-03-01", "School");
        set.Tables.Add(table1);
        set.Tables.Add(table2);
        ExportDataSetToExcel(set, "D:\\test.xlsx");
        MessageBox.Show("success");
    }
    private void ExportDataSetToExcel(DataSet ds, string path)
    {
        //Creae an Excel application instance
        Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
        //Create an Excel workbook instance and open it from the predefined location
        Microsoft.Office.Interop.Excel.Workbook excelWorkBook = excelApp.Workbooks.Add(Type.Missing);
        int count = 1;
        foreach (System.Data.DataTable table in ds.Tables)
        {
            //Add a new worksheet to workbook with the Datatable name
            Microsoft.Office.Interop.Excel.Worksheet excelWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)excelWorkBook.ActiveSheet;
            excelWorkSheet.Name = table.TableName;

            for (int i = 1; i < table.Columns.Count + 1; i++)
            {
                excelWorkSheet.Cells[1, i] = table.Columns[i - 1].ColumnName;
            }

            for (int j = 0; j < table.Rows.Count; j++)
            {
                for (int k = 0; k < table.Columns.Count; k++)
                {
                    excelWorkSheet.Cells[j + 2, k + 1] = table.Rows[j].ItemArray[k].ToString();
                }
            }
            if(count<ds.Tables.Count)
            {
                excelWorkBook.Sheets.Add(excelWorkSheet);
            }

            count++;
        }

        excelWorkBook.SaveAs(path);
        excelWorkBook.Close();
        excelApp.Quit();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...