如何通过编程将XML转换为Excel文件

3

我有一个包含我的项目小数据的xml文档,我想将它转换为Excel文件(Microsoft Office Excel 2003及以上版本)

我该如何以编程方式实现这个目标?


你想要简单地将XML转换为XLS吗?还是你想要将XML文件中的数据映射(以某种方式格式化)到XLS表格中? - mipe34
8个回答

6

您可以使用以下代码来实现:

首先声明必要的引用。

Microsoft.Office.Interop.Excel
using System;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using Microsoft.Office.Tools.Excel;
using Microsoft.VisualStudio.Tools.Applications.Runtime;
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
using System.Diagnostics;
using Microsoft.Win32;

请按照以下步骤创建Excel应用程序:
Excel.Application excel2; // Create Excel app
Excel.Workbook DataSource; // Create Workbook
Excel.Worksheet DataSheet; // Create Worksheet
excel2 = new Excel.Application(); // Start an Excel app
DataSource = (Excel.Workbook)excel2.Workbooks.Add(1); // Add a Workbook inside
string tempFolder = System.IO.Path.GetTempPath(); // Get folder 
string FileName = openFileDialog1.FileName.ToString(); // Get xml file name

接下来,在循环中使用以下代码以确保复制 XML 文件中的所有项

// Open that xml file with excel
DataSource = excel2.Workbooks.Open(FileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
// Get items from xml file
DataSheet = DataSource.Worksheets.get_Item(1);
// Create another Excel app as object
Object xl_app;
xl_app = GetObj(1, "Excel.Application");
Excel.Application xlApp = (Excel.Application)xl_app;
// Set previous Excel app (Xml) as ReportPage
Excel.Application ReportPage = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
// Copy items from ReportPage(Xml) to current Excel object
Excel.Workbook Copy_To_Excel = ReportPage.ActiveWorkbook;

现在我们有一个名为Copy_To_Excel的Excel对象,其中包含Xml中的所有项目.. 我们可以将Excel对象保存并使用所需的名称关闭..
Copy_To_Excel.Save("thePath\theFileName");
Copy_To_Excel.Close();

1
请提供您回答的简要说明。 - Dave Clemmer
1
编辑你的答案以添加解释。这对于寻找答案并试图弄清楚情况的人更有帮助。 - Sid Holland
@SidHolland 我想只要这是关于 XML 的问题,我应该把这个赏金给一个基于 Web 的解决方案.. 你觉得呢? - Berker Yüceer
我知道这个帖子已经几年了,但我决定给这个回答点个踩,因为1)它不完整 2)根本没有任何解释。 - Anonymous
1
什么是GetObj? - Demodave
显示剩余4条评论

2
如果您可以控制生成的XML文件,那么就生成一个XML电子表格文件(Excel 2002和2003的XML文件标准)。
这些文件可以在Excel中本地打开,无需更改扩展名。(为了默认在Excel中打开,文件扩展名应设置为“XML编辑器”打开,这是一个Office应用程序,将XML文件路由到Excel、Word、PowerPoint、InfoPath或者您所需的外部XML编辑器。这是安装Office时的默认映射,但它可能对一些用户不合适,特别是那些在文本编辑器中编辑XML文件的开发人员。)
或者使用NPOI库生成本机(97/2000 BIFF/XLS)Excel文件,而不是XML。

是的,用Excel打开XML文件是可以的,但我想把我的XML文件作为一个Excel文件,我会在Excel上编写一些小宏来处理它。 - Cmptrb

2

你甚至可以将XML文件读取为字符串,并使用正则表达式来读取标签之间的内容并创建CSV文件,或者使用xpath表达式来读取XML文件数据并导出到CSV文件。


你甚至可以编写一个XSLT将XML转换为CSV。 - Laxmikanth Samudrala

1

1. 将xml文件填入数据集中,
2. 通过以下方法在asp.net中将数据集转换为Excel

这些都是非常简单的方法。

  public static void Convert(System.Data.DataSet ds, System.Web.HttpResponse response)
    {
        //first let's clean up the response.object
        response.Clear();
        response.Charset = "";
        //set the response mime type for excel
        response.ContentType = "application/vnd.ms-excel";
        //create a string writer
        System.IO.StringWriter stringWrite = new System.IO.StringWriter();


        //create an htmltextwriter which uses the stringwriter
        System.Web.UI.HtmlTextWriter htmlWrite = new System.Web.UI.HtmlTextWriter(stringWrite);
        //instantiate a datagrid
        System.Web.UI.WebControls.DataGrid dg = new System.Web.UI.WebControls.DataGrid();
        //set the datagrid datasource to the dataset passed in
        dg.DataSource = ds.Tables[0];
        //bind the datagrid
        dg.DataBind();


        //tell the datagrid to render itself to our htmltextwriter
        dg.RenderControl(htmlWrite);
        //all that's left is to output the html
        response.Write(stringWrite.ToString());
        response.End();
    }

1

我不知道有什么简单的方法可以将基于xml的电子表格转换为xls/xlsx。但你可以研究一下Microsoft Open Xml SDK,它可以让你处理xlsx文件。你可以构建一个xlsx电子表格,然后将数据填入其中。在open-xml SDK的层面上,这就像构建一个xml文件。


0

对于数组元素,请使用逗号“,”分隔,并重复使用相同的列名

1)XML函数

public static class XMLFunctions
{       
    public static List<Tuple<string, string>> GetXMlTagsAndValues(string xml)
    {
        var xmlList = new List<Tuple<string, string>>();

        var doc = XDocument.Parse(xml);

        foreach (var element in doc.Descendants())
        {
            // we don't care about the parent tags
            if (element.Descendants().Count() > 0)
            {
                continue;
            }

            var path = element.AncestorsAndSelf().Select(e => e.Name.LocalName).Reverse();
            var xPath = string.Join("/", path); 

            xmlList.Add(Tuple.Create(xPath, element.Value));
        }

        return xmlList;
    }

    public static System.Data.DataTable CreateDataTableFromXmlFile(string xmlFilePath)
    {
        System.Data.DataTable Dt = new System.Data.DataTable();
        string input = File.ReadAllText(xmlFilePath);

        var xmlTagsAndValues = GetXMlTagsAndValues(input);
        var columnList = new List<string>();

        foreach(var xml in xmlTagsAndValues)
        {
            if(!columnList.Contains(xml.Item1))
            {
                columnList.Add(xml.Item1);
                Dt.Columns.Add(xml.Item1, typeof(string));
            }                    
        }

        DataRow dtrow = Dt.NewRow();
        var columnList2 = new Dictionary<string, string>(); 

        foreach (var xml in xmlTagsAndValues)
        {
            if (!columnList2.Keys.Contains(xml.Item1))
            {
                dtrow[xml.Item1] = xml.Item2;
                columnList2.Add(xml.Item1, xml.Item2);
            }
            else
            {   // Here we are using the same column but appending the next value
                dtrow[xml.Item1] = columnList2[xml.Item1] + "," + xml.Item2;

                columnList2[xml.Item1] = columnList2[xml.Item1] + "," + xml.Item2;
            }

        }

        Dt.Rows.Add(dtrow);

        return Dt;
    }
}

2) 完整的Excel类

using Microsoft.Office.Interop.Excel;
using _Excel = Microsoft.Office.Interop.Excel;

public class Excel 
{
    string path = "";
    Application excel = new _Excel.Application();
    Workbook wb;
    Worksheet ws;
    public Range xlRange;

    static bool saveChanges = false;
    static int excelRow = 0;
    static List<string> columnHeaders = new List<string>();    

    public Excel(string path, int Sheet = 1)
    {
        this.path = path;
        wb = excel.Workbooks.Open(path);
        ws = wb.Worksheets[Sheet];
        xlRange = ws.UsedRange;
        excelRow = 0;
        columnHeaders = new List<string>();
    }

    public void SaveFile(bool save = true)
    {
        saveChanges = save;
    }

    public void Close()
    {
        wb.Close(saveChanges);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);
        excel.Quit();
    }                      

    public void XMLToExcel(string xmlFilePath)
    {
        var dt = XMLFunctions.CreateDataTableFromXmlFile(xmlFilePath);
        AddDataTableToExcel(dt);
    }

    public void AddDataTableToExcel(System.Data.DataTable table)
    {       
        // Creating Header Column In Excel
        for (int i = 0; i < table.Columns.Count; i++)   
        {
            if (!columnHeaders.Contains(table.Columns[i].ColumnName))
            {
                ws.Cells[1, columnHeaders.Count() + 1] = table.Columns[i].ColumnName;
                columnHeaders.Add(table.Columns[i].ColumnName);
            }
        } 

        // Get the rows
        for (int k = 0; k < table.Columns.Count; k++)
        {
            var columnNumber = columnHeaders.FindIndex(x => x.Equals(table.Columns[k].ColumnName));

            ws.Cells[excelRow + 2, columnNumber + 1] = table.Rows[0].ItemArray[k].ToString();
        }

        excelRow++; 
        SaveFile(true);         
    }
}

3) 调用它

var excel = new Excel(excelFilename);

foreach (var filePath in files)
{   
    excel.XMLToExcel(filePath); 
}

excel.Close();

对于具有追加递增列名称的数组元素(例如column_2)

从Xml文件重新创建数据表

public static System.Data.DataTable CreateDataTableFromXmlFile(string xmlFilePath)
{
    System.Data.DataTable Dt = new System.Data.DataTable();

    string input = File.ReadAllText(xmlFilePath);

    var xmlTagsAndValues = GetXMlTagsAndValues(input);
    var columnList = new List<string>();

    foreach (var xml in xmlTagsAndValues)
    {
        if (!columnList.Contains(xml.Item1))
        {
            columnList.Add(xml.Item1);
            Dt.Columns.Add(xml.Item1, typeof(string));
        }                   
        else 
        {
            var columnName = xml.Item1;

            do
            {
                columnName = columnName.Increment();
            } while (columnList.Contains(columnName));

            columnList.Add(columnName);
            Dt.Columns.Add(columnName, typeof(string));

        }
    }

    DataRow dtrow = Dt.NewRow();
    var columnList2 = new Dictionary<string, string>();  

    foreach (var xml in xmlTagsAndValues)
    {
        if (!columnList2.Keys.Contains(xml.Item1))
        {
            dtrow[xml.Item1] = xml.Item2;
            columnList2.Add(xml.Item1, xml.Item2);
        }
        else
        {
            var columnName = xml.Item1;

            do
            {
                columnName = columnName.Increment();
            } while (columnList2.Keys.Contains(columnName));

            dtrow[columnName] = xml.Item2;
            columnList2[columnName] = xml.Item2;
        }           
    }

    Dt.Rows.Add(dtrow);

    return Dt;
}

字符串扩展

public static class StringExtensions
{
    public static string Increment(this string str)
    {
        if (!str.Contains("_"))
        {
            str += "_2";
            return str;
        }

        var number = int.Parse(str.Substring(str.LastIndexOf('_') + 1));            

        var stringBefore = StringFunctions.GetUntilOrEmpty(str, "_");            

        return $"{stringBefore}_{++number}";
    }
}

使用 GetUntilOrEmpty


-3

如何在Excel 2003中打开XML文件

简单来说,您可以使用文件打开 来打开它。然后,当您选择一个XML文件时,会提示您选择以下导入XML数据的方法之一:

  • 作为XML列表
  • 作为只读工作簿
  • 使用XML源任务窗格

我知道,谢谢;但是我需要一段代码来按照我下面说的做。我找到的MSDN文档太旧了,而且太复杂了,难以理解 :( - Cmptrb

-4

你不能直接在Excel中打开它吗?我以为Excel能识别XML后缀呢?


3
XML文件可以轻松在Excel中打开。通过一个程序将XML文件转换,是为了更方便地在Excel表格中打开XML文件。如果只告诉别人这是一个XML文档,请用Excel打开并不太容易。而直接改变文件扩展名也不行。 - Cmptrb
晚来一步,但我不确定我理解了你的解释。我想你是说你想用代码来实现它。但是我不知道你所说的“转换的原因是为了更加普通地打开...”是什么意思。我完全不知道那是什么意思。 - MJB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接