65.9K
CodeProject 正在变化。 阅读更多。
Home

将 XML 文件转换为 Excel 文件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.32/5 (9投票s)

2017 年 11 月 27 日

CPOL

2分钟阅读

viewsIcon

43899

downloadIcon

1943

将 XML 数据转换为 DataTable 并将 DataTable 导出到 Excel 文件

引言

在本技巧中,我将与您分享在 C# 中将 XML 转换为 Excel 的方法。

在这里,我们将学习在 C# WindowsForm 应用程序中读取 XML 文件。我们将创建一个小型单窗体应用程序,该应用程序从用户处获取 XML 文件,并将 XML 数据转换为 Excel 数据并返回 Excel 文件。

目标受众

目标受众是对 C# 有基本了解的人。

解释

要做的事情

  • 创建一个 C# WinForm 应用程序
  • 添加引用
  • 创建 UI
  • 代码

创建一个新项目,并为其指定一个合适的名称,就像我给项目命名为“ConvertXmlToXl”一样。

Create New Project

创建项目后,您必须在项目中添加一个名为“Microsoft Excel 对象库”的引用。您将在“COM”部分找到此引用。

Add Reference

现在,创建一个 UI,其中包含两个 Button,两个 Textbox,一个 CheckBox,一个 ProgressBar 和一个 OpenFileDialog 工具。 一个按钮用于浏览 XML 文件,checkbox 用于为用户提供自定义 Excel 文件名的选项。 progressbar 用于显示转换进度。 另一个按钮用于将 XML 文件转换为 Excel。

因此,我们的 UI 看起来如下

UI Design

现在,编写按钮的点击事件代码来浏览计算机文件,以便用户可以选择他的 XML 文件。 在 OpenFileDialog 工具中设置过滤器“XML 文件 (*.xml)|*.xml|所有文件 (*.*)|*.*”,以便在浏览文件时首选 Excel 文件。 用户可以通过选中“Excel 文件名”复选框并相应地在 textbox 中输入 Excel 文件名来提供自定义 Excel 文件名。 之后,用户只需单击“转换”按钮即可转换 XML 文件。 因此,双击“转换”按钮以打开单击事件。

代码

using System.Data;
using System.Runtime.InteropServices;
using Microsoft.Office.Interop.Excel;

文件浏览按钮点击事件的代码

 private void btnBrowseFolder_Click(object sender, EventArgs e)
  {
      DialogResult drResult = OFD.ShowDialog();
      if (drResult == System.Windows.Forms.DialogResult.OK)
          txtXmlFilePath.Text = OFD.FileName;
  }

“转换”按钮点击事件的代码

private void btnConvert_Click(object sender, EventArgs e)
        {
            // Resetting the progress bar Value
            progressBar1.Value = 0;

            if (chkCustomeName.Checked && txtCustomeFileName.Text != "" && 
            txtXmlFilePath.Text != "") // using Custom Xml File Name
            {
                if (File.Exists(txtXmlFilePath.Text)) // Checking XMl File is Exist or Not
                {
                    string CustXmlFilePath = 
                           Path.Combine(new FileInfo(txtXmlFilePath.Text).DirectoryName, 
                    txtCustomeFileName.Text); // Creating Path for Xml Files
                    System.Data.DataTable dt = CreateDataTableFromXml(txtXmlFilePath.Text);
                    ExportDataTableToExcel(dt, CustXmlFilePath);

                    MessageBox.Show("Conversion Completed!!");
                }

            }
            else if (!chkCustomeName.Checked || 
                         txtXmlFilePath.Text != "") // Using Default Xml File Name
            {
                if (File.Exists(txtXmlFilePath.Text)) // Checking XMl File is Exist or Not
                {
                    FileInfo fi = new FileInfo(txtXmlFilePath.Text);
                    string XlFile = fi.DirectoryName + "\\" + fi.Name.Replace
                    (fi.Extension,".xlsx"); // CReating Default File Name
                    System.Data.DataTable dt = CreateDataTableFromXml
                    (txtXmlFilePath.Text); // Getting XML Data into DataTable
                    ExportDataTableToExcel(dt, XlFile);

                    MessageBox.Show("Conversion Completed!!");
                }
            }
            else
            {
                MessageBox.Show("Please Fill Required Fields!!");
            }
        }

在“CreateDataTableFromXml”函数中,我们只是将 XML 数据转换为“DataTable”。 此函数返回一个 DataTable,我们将此 datatable 导出到 Excel 文件中。

 // Creating DataTable With Xml Data
        public System.Data.DataTable CreateDataTableFromXml(string XmlFile)
        {
            System.Data.DataTable Dt = new System.Data.DataTable();
            try
            {
                DataSet ds = new DataSet();
                ds.ReadXml(XmlFile);
                Dt.Load(ds.CreateDataReader());
            }
            catch (Exception ex)
            {

            }
            return Dt;
        }

在“ExportDataTableToExcel”函数中,我们通过函数的参数传递 DataTable 和 Excel 文件名。 我们正在创建新的 Excel 文件,并将 DataTable 的列名作为 Excel 文件中的标题行导出。 并且还导出 DataRow 作为 Excel 行。

private void ExportDataTableToExcel(System.Data.DataTable table, string Xlfile)
        {
            Microsoft.Office.Interop.Excel.Application excel = 
                                 new Microsoft.Office.Interop.Excel.Application();
            Workbook book = excel.Application.Workbooks.Add(Type.Missing);
            excel.Visible = false;
            excel.DisplayAlerts = false;
            Worksheet excelWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)book.ActiveSheet;
            excelWorkSheet.Name = table.TableName;

            progressBar1.Maximum = table.Columns.Count;
            for (int i = 1; i < table.Columns.Count + 1; i++) // Creating Header Column In Excel
            {
                excelWorkSheet.Cells[1, i] = table.Columns[i - 1].ColumnName;
                if (progressBar1.Value < progressBar1.Maximum)
                {
                    progressBar1.Value++;
                    int percent = (int)(((double)progressBar1.Value / 
                    (double)progressBar1.Maximum) * 100);
                    progressBar1.CreateGraphics().DrawString(percent.ToString() + 
                    "%", new System.Drawing.Font("Arial", 
                    (float)8.25, FontStyle.Regular), Brushes.Black, 
                    new PointF(progressBar1.Width / 2 - 10, progressBar1.Height / 2 - 7));
                    System.Windows.Forms.Application.DoEvents();
                }
            }

            progressBar1.Maximum = table.Rows.Count;
            for (int j = 0; j < table.Rows.Count; j++) // Exporting Rows in Excel
            {
                for (int k = 0; k < table.Columns.Count; k++)
                {
                    excelWorkSheet.Cells[j + 2, k + 1] = table.Rows[j].ItemArray[k].ToString();
                }

                if (progressBar1.Value < progressBar1.Maximum)
                {
                    progressBar1.Value++;
                    int percent = (int)(((double)progressBar1.Value / 
                                         (double)progressBar1.Maximum) * 100);
                    progressBar1.CreateGraphics().DrawString(percent.ToString() + 
                    "%", new System.Drawing.Font("Arial", 
                    (float)8.25, FontStyle.Regular), Brushes.Black, 
                    new PointF(progressBar1.Width / 2 - 10, progressBar1.Height / 2 - 7));
                    System.Windows.Forms.Application.DoEvents();
                }
            }

            book.SaveAs(Xlfile);
            book.Close(true);
            excel.Quit();

            Marshal.ReleaseComObject(book);
            Marshal.ReleaseComObject(book);
            Marshal.ReleaseComObject(excel);
        }

结论

通过使用这些简单的方法,我们可以将 XML 文件转换为 DataTable。 从 DataTable 中,我们可以将数据导出到 Excel 文件中,或者我们可以创建一个新的 Excel 文件并导出 DataTableData,我们还可以通过简单地将 DataGridView 属性“DataSource”设置为 DataTable,从而在“DataGridView”中显示 DataTableData

希望这对您有所帮助,您会喜欢这篇文章。

请在下面的评论中提供您宝贵的反馈。

© . All rights reserved.