xls-xml 文件到 CSV

Posted

技术标签:

【中文标题】xls-xml 文件到 CSV【英文标题】:xls-xml file to CSV 【发布时间】:2012-10-24 08:29:11 【问题描述】:

我有一个从黑盒系统收到的文件,该文件以某种方式在 xml 和 excel 之间混合,当我用 excel 打开文件时,我首先收到一条警告消息,如果我用文本编辑器打开它,以下 xml头是:

<?xml version="1.0" encoding="UTF-8"?>
    <?mso-application progid="Excel.Sheet"?>
    <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
        xmlns:o="urn:schemas-microsoft-com:office:office"
        xmlns:x="urn:schemas-microsoft-com:office:excel"
        xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
        xmlns:html="http://www.w3.org/TR/REC-html40">

        <Styles>

                <Style ss:ID="Default">
                    <Alignment ss:Horizontal="Left" ss:Vertical="Bottom" />
                    <Borders/>
                    <Font/>
                    <Interior/>
                    <NumberFormat/>
                    <Protection/>
                </Style>
                <Style ss:ID="sHeader">
                    <Alignment ss:Horizontal="Left" ss:Vertical="Bottom" />
                    <Font ss:Bold="1"/>
                    <NumberFormat ss:Format="@"/>
                </Style>

我尝试了许多解决方案,包括(首先尝试将文件导入 DataGridView 然后将其导出到 csv 但是我总是得到无法识别的数据库格式

首先,这是什么样的xls和xml文件混合在一起?我怎样才能删除所有这些头部信息并只拥有一个简单的 csv 文件?

更新: 我找到了一种从这个 excel-XML 文件加载数据的方法,但是我在一列中收到所有数据

这是我使用的代码:

 XmlDocument xml = new XmlDocument();
            string filePath = @"C:\temp\test.xml";
            xml.Load(filePath);
            XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable);
            nsmgr.AddNamespace("ss", "urn:schemas-microsoft-com:office:spreadsheet");
            XmlElement root = xml.DocumentElement;
            XmlNodeList nodeList = root.SelectNodes("//ss:Data", nsmgr);
            dataGridView1.DataSource= ConvertXmlNodeListToDataTable(nodeList);


public static DataTable ConvertXmlNodeListToDataTable(XmlNodeList xnl)
        

            DataTable dt = new DataTable();

            int TempColumn = 0;



            foreach (XmlNode node in xnl.Item(0).ChildNodes)
            

                TempColumn++;

                DataColumn dc = new DataColumn(node.Name, System.Type.GetType("System.String"));

                if (dt.Columns.Contains(node.Name))
                

                    dt.Columns.Add(dc.ColumnName = dc.ColumnName + TempColumn.ToString());

                

                else
                

                    dt.Columns.Add(dc);

                

            

            int ColumnsCount = dt.Columns.Count;
            for (int i = 0; i < xnl.Count; i++)
            

                DataRow dr = dt.NewRow();

                for (int j = 0; j < ColumnsCount; j++)
                

                    dr[j] = xnl.Item(i).ChildNodes[j].InnerText;

                

                dt.Rows.Add(dr);

            

            return dt;

        

    

【问题讨论】:

您检查过最新版本的 Microsoft Office 使用的 XML 格式吗? 我已经安装了office 2007,我相信送文件的公司使用的是office 2003 格式的 google 出现了一些东西,包括这个 en.wikipedia.org/wiki/Microsoft_Office_XML_formats 【参考方案1】:

我找到了解决办法:

使用microsoft命名空间加载xls-xml文件 获取xmlNodeList

请注意,在我所在的地区,我们使用分号作为分隔符

public static XmlNodeList ParseExcelEXMLFormat(string filePath)
   
       try
       

            XmlDocument xml = new XmlDocument();
            xml.Load(filePath);
            XmlNamespaceManager nsSchema = new XmlNamespaceManager(xml.NameTable);
            nsSchema.AddNamespace("ss", "urn:schemas-microsoft-com:office:spreadsheet");
            XmlElement root = xml.DocumentElement;
            XmlNodeList nodeList = root.SelectNodes("//ss:Data", nsSchema);
            return nodeList;
       
       catch (Exception)
       

           throw;
       
   

然后将 XmlNodeList 转换为 StringBuilder

 public static StringBuilder XMLNodeListToStringBuilderConverter(XmlNodeList xmlNodeList, string separator)
   
       try
       
           StringBuilder sb = new StringBuilder();
           DataTable dt = new DataTable();
           foreach (XmlNode node in xmlNodeList.Item(0).ChildNodes) 
           
               DataColumn dc = new DataColumn(node.FirstChild.InnerText, System.Type.GetType("System.String"));
               dt.Columns.Add(dc);
           

           int ColumnsCount = dt.Columns.Count;

           string[] columnNames = dt.Columns.Cast<DataColumn>().
                                             Select(column => column.ColumnName).
                                             ToArray();
           sb.AppendLine(string.Join(separator, columnNames));

           string[] rows = new string[ColumnsCount];

           for (int i = 1; i < xmlNodeList.Count; i++) // loop through rows
           
               for (int j = 0; j < ColumnsCount; j++) // loop through columns
               

                   rows[j] = xmlNodeList.Item(i).ChildNodes[j].InnerText.Replace(separator, ",").Replace("\r\n", " ").Replace("\n", " ").Replace("\r", " "); // remove seperator from original text, it will casue problem 

               
               sb.AppendLine(string.Join(separator, rows));
               Array.Clear(rows, 0, ColumnsCount);
           

           return sb;
       
       catch (Exception)
       

           throw;
       
   

【讨论】:

以上是关于xls-xml 文件到 CSV的主要内容,如果未能解决你的问题,请参考以下文章

Logstash导入csv到es

如何将列从一个 CSV 文件复制到另一个 CSV 文件?

将 CSV 文件的内容复制到现有工作簿,然后移动 CSV

如何用python把多个csv文件数据处理后汇总到新csv文件

如何使用 CSV 文件中的标题从 CSV 文件复制到 PostgreSQL 表?

Qt中如何读取csv文件到二维数组