Open XML从完整的Excel文件仅生成<newdataset>标记,但可用于其他文件

时间:2018-06-20 10:33:49

标签: asp.net xml excel openxml openxml-sdk

我有一个充满数据的excel文件,我正尝试使用 Open XML SDK 将此文件转换为xml文件。

我在这里关注了关于堆栈溢出的文档和其他问题。但是,xml文件的输出始终为<NewDataSet />。知道我尝试了其他excel文件,效果很好。

这是我的excel文件的外观: enter image description here

这是我的代码“我尝试了两种方法”:

第一种方法是使用DataSet.GetXML(),它返回与下一个代码相同的值。

var xmlDS = new ConvertExcelToXml().GetXML(filePath);
string xmlPath = server.MapPath("~/UploadedFiles/XML/");

StreamWriter xmlFile = new StreamWriter(xmlPath + Path.GetFileNameWithoutExtension(fileName) + ".xml");
xmlDS.WriteXml(xmlFile);



//The used method to return the excel file dataset
public DataSet GetXML(string filename)
{
  using (DataSet ds = new DataSet())
  {
    ds.Tables.Add(this.ReadExcelFile(filename));
    return ds;
  }
}

//This method used to return DataTable for previous method
private DataTable ReadExcelFile(string filename)
{
        DataTable dt = new DataTable();

        try
        {
            using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filename, false))
            {
                WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
                IEnumerable<Sheet> sheetcollection = spreadsheetDocument.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>();

                string relationshipId = sheetcollection.First().Id.Value;

                WorksheetPart worksheetPart = (WorksheetPart)spreadsheetDocument.WorkbookPart.GetPartById(relationshipId);

                SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();
                IEnumerable<Row> rowcollection = sheetData.Descendants<Row>();

                if (rowcollection.Count() == 0)
                {
                    return dt;
                }

                foreach (Cell cell in rowcollection.ElementAt(0))
                {
                    dt.Columns.Add(GetValueOfCell(spreadsheetDocument, cell));
                }

                foreach (Row row in rowcollection)
                {
                    DataRow temprow = dt.NewRow();
                    int columnIndex = 0;
                    foreach (Cell cell in row.Descendants<Cell>())
                    {
                        int cellColumnIndex = GetColumnIndex(GetColumnName(cell.CellReference));
                        if (columnIndex < cellColumnIndex)
                        {
                            do
                            {
                                temprow[columnIndex] = string.Empty;
                                columnIndex++;
                            }

                            while (columnIndex < cellColumnIndex);
                        }

                        temprow[columnIndex] = GetValueOfCell(spreadsheetDocument, cell);
                        columnIndex++;
                    }

                    dt.Rows.Add(temprow);
                }
            }
            dt.Rows.RemoveAt(0);
            return dt;
        }
        catch (IOException ex)
        {
            throw new IOException(ex.Message);
        }
}

0 个答案:

没有答案