7

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

过去有人做过这样的事情并且可以帮助我吗?

4

4 回答 4

5

尝试下面的代码,在其中我将 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();
于 2013-07-15T09:11:18.887 回答
2

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

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

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

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

于 2013-07-15T08:53:11.910 回答
1

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

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

于 2013-07-15T08:37:51.863 回答
0

如果您从数据集中获取多个表,请使用以下代码,并且您应该注意将数据表插入 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();

    }
于 2013-07-16T06:32:14.530 回答