XML 到 CSV 的转换,如 MS Excel

Posted

技术标签:

【中文标题】XML 到 CSV 的转换,如 MS Excel【英文标题】:XML to CSV conversion like MS Excel 【发布时间】:2021-06-02 20:45:37 【问题描述】:

我有以下 XML 输入集

<Bill>
   <HeaderGroup>
      <Name>Mr Consumer</Name>
      <Address>My Factory Address</Address>
   </HeaderGroup>
   <BillHistoryGroup>
      <BillHistoryRow>
         <BillMonth>JAN</BillMonth>
         <BillUnit>100</BillUnit>
      </BillHistoryRow>
      <BillHistoryRow>
         <BillMonth>FEB</BillMonth>
         <BillUnit>200</BillUnit>
      </BillHistoryRow>
      <BillHistoryRow>
         <BillMonth>MAR</BillMonth>
         <BillUnit>300</BillUnit>
      </BillHistoryRow>
   </BillHistoryGroup>
   <PaymentHistoryGroup>
      <PaymentHistoryRow>
         <PaymentMonth>SEP</PaymentMonth>
         <PaymentAmount>1000</PaymentAmount>
      </PaymentHistoryRow>
      <PaymentHistoryRow>
         <PaymentMonth>OCT</PaymentMonth>
         <PaymentAmount>1500</PaymentAmount>
      </PaymentHistoryRow>
   </PaymentHistoryGroup>
</Bill>

当我使用 excel 加载此文件时,我想生成 MS Excel 生成的数据的表格视图

鉴于代码可以动态理解输入 XML 数据集中存在的不同数量的记录和列,我如何在 C# 中实现相同的输出。任何帮助将不胜感激!

【问题讨论】:

所以你的第一个任务,是学习如何反序列化 xml。完成后,您可以继续处理其他组件问题 先看docs.microsoft.com/en-us/dotnet/api/…,再推荐joshclose.github.io/CsvHelper。 “代码可以动态理解输入 XML 数据集中存在的不同数量的记录和列。” 这是不可能的。 XML 有许多可能的结构。没有办法自动确定什么应该是记录,什么应该是列。即使是相同的 XML 也可能因不同的目的而进行不同的解析。您需要提前建立一些规则 - 并且,这些规则必然只适用于具有相同或相似结构的 XML 文档。 @michael.hor257k,感谢您的回复,但是 MS Excel 如何做到这一点 我不知道(我不使用 Excel)。 【参考方案1】:

尝试以下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1

    class Program
    
        const string INPUT_FILENAME = @"c:\temp\test.xml";
        const string OUTPUT_FILENAME = @"c:\temp\test.csv";
        static void Main(string[] args)
        
            StreamWriter writer = new StreamWriter(OUTPUT_FILENAME);
            string[] headers = "Name", "Address", "BillMonth", "BillUnit","PaymentMonth", "PaymentAmount";

            writer.WriteLine(string.Join(",", headers));

            XDocument doc = XDocument.Load(INPUT_FILENAME);

            foreach (XElement bill in doc.Descendants("Bill"))
            
                string name = (string)bill.Descendants("Name").FirstOrDefault();
                string address = (string)bill.Descendants("Address").FirstOrDefault();

                foreach(XElement billHistoryRow in bill.Descendants("BillHistoryRow"))
                
                    string billMonth = (string)billHistoryRow.Descendants("BillMonth").FirstOrDefault();
                    string billUnit = (string)billHistoryRow.Descendants("BillUnit").FirstOrDefault();
                    writer.WriteLine(string.Join(",", new string[]  name, address, billMonth, billUnit )); 
                
                foreach (XElement paymentHistoryRow in bill.Descendants("PaymentHistoryRow"))
                
                    string paymentMonth = (string)paymentHistoryRow.Descendants("PaymentMonth").FirstOrDefault();
                    string paymentAmount = (string)paymentHistoryRow.Descendants("PaymentAmount").FirstOrDefault();
                    writer.WriteLine(string.Join(",", new string[]  name, address, "", "", paymentMonth, paymentAmount ));
                


            


            writer.Flush();
            writer.Close();
        
    

【讨论】:

以上是关于XML 到 CSV 的转换,如 MS Excel的主要内容,如果未能解决你的问题,请参考以下文章

如何批量将CSV格式的文件转化成excel格式

怎么讲csv格式转换为xlsx

csv格式转换到excel(将大容量的csv文件转为xls)

CSV格式转换到excel,怎么做?

CSV格式转换到excel,怎么做?

csv文件怎么转换为Excel文件