C#利用Openxml读取Excel数据实例
本文实例讲述了C#利用Openxml读取Excel数据的方法,分享给大家供大家参考。具体分析如下:
这里有些问题,如果当Cell里面是日期和浮点型的话,对应的Cell.DataType==Null,对应的时间会转换为一个浮点型,对于这块可以通过DateTime.FromOADate(doubled)转换为时间。可是缺点的地方就是,如果Cell.DataType==NULL,根本无法确认这个数据到底是浮点型还是[被转换为了日期的浮点数]。查阅了很多国外资料,的确国外博客有一部分都反映了。有关Openxml读取Excel时Cell.DataType==NULL的问题。本例子没考虑那个问题,现在还没解决。等后面查询到更详细的资料再解决。
其次解决这个问题的方法只有,在数据处理的时候,数据分析我们是可以知道这一列的数据到底是什么类型,然后根据自己的需求,自己对获取的数据做相应转换处理。不过如果使用OleDb的Select语句来读取Excel的时候,就不会出现这个问题,读取到Datable时候是日期就不会转换为浮点型数据。而且对象的Datable对于的那个单元格数据还可以直接强制转换为DateTime。不过用OleDB读取数据感觉上应该没有Openxml目前还没测试大数据,太晚了。该sleep了。如果有大神了解Openxml读取表格,请指点[需要解决问题是:EXCEL的表格中CELL的DateTime类型和浮点类型数据,在获取后如何区分。因为使用Openxml获取后日期会被自动转换为浮点型]
参考代码如下:
usingSystem; usingSystem.Collections.Generic; usingSystem.Data; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; usingDocumentFormat.OpenXml.Packaging; usingDocumentFormat.OpenXml.Spreadsheet; namespaceReadExcel { publicclassProgram { staticvoidMain(string[]args) { DataTabledt=newDataTable(); using(SpreadsheetDocumentspreadSheetDocument=SpreadsheetDocument.Open(@"Test.xlsx",false)) { WorkbookPartworkbookPart=spreadSheetDocument.WorkbookPart; IEnumerable<Sheet>sheets=spreadSheetDocument.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>(); stringrelationshipId=sheets.First().Id.Value=sheets.First(x=>x.Name=="TestSheet").Id.Value; WorksheetPartworksheetPart=(WorksheetPart)spreadSheetDocument.WorkbookPart.GetPartById(relationshipId); WorksheetworkSheet=worksheetPart.Worksheet; SheetDatasheetData=workSheet.GetFirstChild<SheetData>(); Row[]rows=sheetData.Descendants<Row>().ToArray(); //设置表头DataTable foreach(Cellcellinrows.ElementAt(0)) { dt.Columns.Add((string)GetCellValue(spreadSheetDocument,cell)); } //添加内容 for(introwIndex=1;rowIndex<rows.Count();rowIndex++) { DataRowtempRow=dt.NewRow(); for(inti=0;i<rows[rowIndex].Descendants<Cell>().Count();i++) { tempRow[i]=GetCellValue(spreadSheetDocument,rows[rowIndex].Descendants<Cell>().ElementAt(i)); } dt.Rows.Add(tempRow); } } Console.ReadKey(); } publicstaticstringGetCellValue(SpreadsheetDocumentdocument,Cellcell) { SharedStringTablePartstringTablePart=document.WorkbookPart.SharedStringTablePart; stringvalue=cell.CellValue.InnerXml; if(cell.DataType!=null&&(cell.DataType.Value==CellValues.SharedString||cell.DataType.Value==CellValues.String||cell.DataType.Value==CellValues.Number)) { returnstringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText; } else//浮点数和日期对应的cell.DataType都为NULL { //DateTime.FromOADate((double.Parse(value));如果确定是日期就可以直接用过该方法转换为日期对象,可是无法确定DataType==NULL的时候这个CELL数据到底是浮点型还是日期.(日期被自动转换为浮点 returnvalue; } } } }
希望本文所述对大家的C#程序设计有所帮助.