Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将C#.xml转换为.xlsx?_C#_Xml_Xlsx - Fatal编程技术网

如何将C#.xml转换为.xlsx?

如何将C#.xml转换为.xlsx?,c#,xml,xlsx,C#,Xml,Xlsx,我想将一个完整的XML文件转换为XLSX,但我不确定如何才能做到这一点。 我在Google上搜索了一个解决方案,但大多数时候我只找到了另一个方向,例如XLSX到XML。 在Microsoft页面上,我发现了一个xmlconvertclass,但我不确定如何使用该类 过去是否有人做过类似的事情并可以帮助我?您需要阅读XLSX文件格式的说明,然后编写XSLT文件来转换自定义XML文件 .NET具有非常好的XML支持,因此类似这样的内容应该是相当简单的,它将是从XML格式到XSLT的实际映射,需要真正

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

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

您需要阅读XLSX文件格式的说明,然后编写XSLT文件来转换自定义XML文件


.NET具有非常好的XML支持,因此类似这样的内容应该是相当简单的,它将是从XML格式到XSLT的实际映射,需要真正的努力。

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

  • 创建符合您需要的“模板”Xslx
  • 对于每个xml数据文件,向xml文件添加数据连接
  • 如果需要,请设置每次打开文件时刷新的数据连接
  • 这是开箱即用的,没有任何代码(当然不包括xml生成)


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

    请尝试以下代码,我在其中将Xml转换为数据集,然后将数据集导出为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();
    

    如果要从dataset获取多个表,请使用下面的代码,并应注意将数据表插入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();
    
        }
    

    这个类怎么样?这个链接可能会有帮助Fridolin:请验证一下最近的答案对我来说最简单的方法是:用Excel打开它并另存为.xlsx,但问题是,有时我有超过1个XML,让用户重复这些步骤。。。我想要一个一键式的解决方案,在我的步骤中加上“for each xml source”。这仍然有效。模板只生成一次。只有xml数据是动态的。哇,创建类。类正在工作,但我只得到第一行和第一列,为什么?这应该适用于所有行。您可以通过调试检查数据表是否正确填充吗?是否填充了第一行和第一列hms。但是我在测试XML中有30列和5行。你能发布你的XML吗?我不知道,我怎么能在这里发布数据文件…:/?嘿,谢谢,它比第一行工作得更好,但我有一个问题,当第1行和第2行在一列中有相同的内容时,它不会在下一行/列中显示信息…最终没有解决方案/