【问题标题】:C# .xml to .xlsx how?C# .xml 到 .xlsx 如何?
【发布时间】:2017-08-17 02:38:48
【问题描述】:

我想将一个完整的 XML 文件转换为 XLSX,但我不知道该怎么做。 我在 Google 上搜索了一个解决方案,但大多数时候我只找到了另一个方向的方法,例如 XLSX 到 XML。 在 Microsoft 页面上,我找到了一个 xmlconvertclass,但我不确定如何使用该类。

过去是否有人做过类似的事情并且可以帮助我?

【问题讨论】:

标签: c# xml xlsx


【解决方案1】:

尝试下面的代码,我将 XML 转换为 DataSet,然后将 DataSet 导出到 Excel

        DataSet ds = new DataSet();

        //Convert the XML into Dataset
        ds.ReadXml(@"E:\movie.xml");

        //Retrieve the table fron Dataset
        DataTable dt = ds.Tables[0];

        // Create an Excel object
        Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();

        //Create workbook object
        string str = @"E:\test.xlsx";
        Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Open(Filename: str);

        //Create worksheet object
        Microsoft.Office.Interop.Excel.Worksheet worksheet = workbook.ActiveSheet;

        // Column Headings
        int iColumn = 0;

        foreach (DataColumn c in dt.Columns)
        {
            iColumn++;
            excel.Cells[1, iColumn] = c.ColumnName;
        }

        // Row Data
        int iRow = worksheet.UsedRange.Rows.Count - 1;

        foreach (DataRow dr in dt.Rows)
        {
            iRow++;

            // Row's Cell Data
            iColumn = 0;
            foreach (DataColumn c in dt.Columns)
            {
                iColumn++;
                excel.Cells[iRow + 1, iColumn] = dr[c.ColumnName];
            }
        }

        ((Microsoft.Office.Interop.Excel._Worksheet)worksheet).Activate();

        //Save the workbook
        workbook.Save();

        //Close the Workbook
        workbook.Close();

        // Finally Quit the Application
        ((Microsoft.Office.Interop.Excel._Application)excel).Quit();

【讨论】:

  • 哇,创建类。而且课程正在工作,但我只得到第一行和第一列,为什么?
  • 这应该适用于所有行。能否通过调试检查DataTable是否填写正确?
  • 用第一行和第一列填充,hms。但我在测试 XML 中有 30 列和 5 行。
  • 你能发布你的 XML 吗?
  • 我不知道,我如何在这里发布数据文件...:/?
【解决方案2】:

更简单的解决方案:使用 Excel 中的数据源。

  1. 创建一个符合您需要的“模板”Xslx。
  2. 对于每个 xml 数据文件,为 xml 文件添加一个数据连接。
  3. 根据需要设置每次打开文件时刷新的数据连接。

这是开箱即用的,根本没有代码(当然不包括 xml 生成)。

或者,您可以通过 ASP.Net 应用程序(动态或非动态)发布您的 Xml,并设置数据连接以从该 asp.net 应用程序收集数据。

【讨论】:

  • 对我来说最简单的方法是:用 Excel 打开它并另存为 .xlsx 但问题是,有时我有超过 1 个 XML 并重复这些步骤......我想要一个单击这个://的解决方案
  • 用“每个 xml 源”围绕我的步骤。这仍然有效。模板生成一次。只有 xml 数据是动态的。
【解决方案3】:

您需要阅读 XLSX 文件格式的 schema 并编写一个 XSLT 文件来转换您的自定义 XML 文件。

.NET 具有非常好的 XML 支持,所以这样的事情应该是相当简单的,它将是从您的 XML 格式到需要真正努力的 XSLT 的实际映射。

【讨论】:

    【解决方案4】:

    如果您从数据集中获取多个表,请使用以下代码,并且您应该注意将数据表插入到 excel 中的逻辑。

        static void Main(string[] args)
        {
            DataSet ds = new DataSet();
    
            //Convert the XML into Dataset
            ds.ReadXml(@"E:\movies.xml");
    
            //Retrieve the table fron Dataset
            //DataTable dt = ds.Tables[0];
    
            // Create an Excel object
            Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
    
            //Create workbook object
            string str = @"E:\test.xlsx";
            Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Open(Filename: str);
    
            foreach (DataTable tab in ds.Tables)
            {
                FromDataTableToExcel(tab,excel,workbook);
            }
    
            //Save the workbook
            workbook.Save();
    
            //Close the Workbook
            workbook.Close();
    
            // Finally Quit the Application
            ((Microsoft.Office.Interop.Excel._Application)excel).Quit();
    
        }
    
        static void FromDataTableToExcel(DataTable dt, Microsoft.Office.Interop.Excel.Application excel, Microsoft.Office.Interop.Excel.Workbook workbook)
        { 
            //Create worksheet object
            Microsoft.Office.Interop.Excel.Worksheet worksheet = workbook.ActiveSheet;
    
            // Column Headings
            int iColumn = worksheet.UsedRange.Columns.Count-1;
            int iColumn1 = iColumn;
            int iColumn2 = iColumn;
    
            foreach (DataColumn c in dt.Columns)
            {
                iColumn++;
                excel.Cells[1, iColumn] = c.ColumnName;
            }
    
            // Row Data
            int iRow = 0;
    
            foreach (DataRow dr in dt.Rows)
            {
                iRow++;
    
                // Row's Cell Data                
                foreach (DataColumn c in dt.Columns)
                {
                    iColumn1++;
                    excel.Cells[iRow + 1, iColumn1] = dr[c.ColumnName];
                }
    
                iColumn1 = iColumn2;
            }
    
            ((Microsoft.Office.Interop.Excel._Worksheet)worksheet).Activate();
    
        }
    

    【讨论】:

    • 嘿,谢谢,它比第一个效果更好,但我有一个问题,当第 1 行和第 2 行在列中具有相同的内容时,它不会在下一行/列中显示信息.. .
    • 最后没有解决办法? ://
    猜你喜欢
    • 2017-06-30
    • 2011-07-08
    • 1970-01-01
    • 2019-12-10
    • 2012-04-02
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    相关资源
    最近更新 更多