使用OpenXML读取Excel文件

我正试图通过OpenXML读取Excel文件,并希望输出到CSV。 目前它读取每个单元格在一个单独的行(由于writeline)或单行(当使用写)。 以Excel等表格forms读取和输出的最佳方式是什么? OpenXML中是否有内置的function,我可以利用这个function?

static void Main(string[] args) { String xlDocName = @"C:\Users\xlp111\source.xlsx"; using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(xlDocName, false)) { WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart; string cellValue = string.Empty; foreach(WorksheetPart worksheetPart in workbookPart.WorksheetParts) { OpenXmlReader reader = OpenXmlReader.Create(worksheetPart); while (reader.Read()) { if (reader.ElementType == typeof(Row)) { reader.ReadFirstChild(); do { if (reader.ElementType == typeof(Cell)) { Cell c = (Cell)reader.LoadCurrentElement(); if (c.DataType != null && c.DataType == CellValues.SharedString) { SharedStringItem ssi = workbookPart.SharedStringTablePart.SharedStringTable.Elements<SharedStringItem>().ElementAt(int.Parse(c.CellValue.InnerText)); cellValue = ssi.Text.Text; Console.WriteLine(cellValue); } } } while (reader.ReadNextSibling()); } } } Console.ReadLine(); } } } 

编辑:

使用用于Microsoft Office的Open XML SDK

从以下url安装V2: https : //www.microsoft.com/zh-CN/download/details.aspx?id=5124&wa=wsignin1.0

(或V2.5)

以下类将Excel表格转换为带有分隔符的CSV文件

  //reference library using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; public class OpenXmlExcel { public void ExcelToCsv(string source, string target, string delimiter = ";", bool firstRowIsHeade = true) { var dt = ReadExcelSheet(source, firstRowIsHeade); DatatableToCsv(dt, target, delimiter); } private void DatatableToCsv(DataTable dt, string fname, string delimiter = ";") { using (StreamWriter writer = new StreamWriter(fname)) { foreach (DataRow row in dt.AsEnumerable()) { writer.WriteLine(string.Join(delimiter, row.ItemArray.Select(x => x.ToString())) + delimiter); } } } List<string> Headers = new List<string>(); private DataTable ReadExcelSheet(string fname, bool firstRowIsHeade) { DataTable dt = new DataTable(); using (SpreadsheetDocument doc = SpreadsheetDocument.Open(fname, false)) { //Read the first Sheets Sheet sheet = doc.WorkbookPart.Workbook.Sheets.GetFirstChild<Sheet>(); Worksheet worksheet = (doc.WorkbookPart.GetPartById(sheet.Id.Value) as WorksheetPart).Worksheet; IEnumerable<Row> rows = worksheet.GetFirstChild<SheetData>().Descendants<Row>(); foreach (Row row in rows) { //Read the first row as header if (row.RowIndex.Value == 1) { var j = 1; foreach (Cell cell in row.Descendants<Cell>()) { var colunmName = firstRowIsHeade ? GetCellValue(doc, cell) : "Field" + j++; Console.WriteLine(colunmName); Headers.Add(colunmName); dt.Columns.Add(colunmName); } } else { dt.Rows.Add(); int i = 0; foreach (Cell cell in row.Descendants<Cell>()) { dt.Rows[dt.Rows.Count - 1][i] = GetCellValue(doc, cell); i++; } } } } return dt; } private string GetCellValue(SpreadsheetDocument doc, Cell cell) { string value = cell.CellValue.InnerText; if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString) { return doc.WorkbookPart.SharedStringTablePart.SharedStringTable.ChildElements.GetItem(int.Parse(value)).InnerText; } return value; } } 

如何使用:

 new OpenXmlExcel().ExcelToCsv("f1.xlsx","f1.csv",";",true); or //use default: separator=";" ,first row is header new OpenXmlExcel().ExcelToCsv("f1.xlsx","f1.csv");