0

ブラックボックス システムから受け取ったファイルがあります。このファイルは何らかの形で 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 ファイルからデータをロードする方法を見つけましたが、すべてのデータを 1 つの列で受け取ります

これは私が使用したコードです:

 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;

        }

    }
4

1 に答える 1

0

私は解決策を見つけました:

Microsoft 名前空間を使用して xls-xml ファイルをロードします Get 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;
       }
   }
于 2012-10-30T14:10:44.937 に答える