Openxml入门---Openxm读取Excel数据

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

Openxml读取Excel数据: 有些问题,如果当Cell 里面是 日期和浮点型的话,对应的Cell.DataType==Null,对应的时间会转换为一个浮点型,对于这块可以通过DateTime.FromOADate(double d)转换为时间。 可是缺点的地方就是,如果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)

{

DataTable dt=newDataTable();using(SpreadsheetDocument spreadSheetDocument = SpreadsheetDocument.Open(@"Test.xlsx",false))

{

WorkbookPart workbookPart=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;

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

Worksheet workSheet=worksheetPart.Worksheet;

SheetData sheetData= workSheet.GetFirstChild<SheetData>();

Row[] rows= sheetData.Descendants<Row>().ToArray();//设置表头DataTableforeach(Cell cellinrows.ElementAt(0))

{

dt.Columns.Add((string)GetCellValue(spreadSheetDocument, cell));

}//添加内容for(introwIndex =1; rowIndex < rows.Count(); rowIndex++)

{

DataRow tempRow=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(SpreadsheetDocument document, Cell cell)

{

SharedStringTablePart stringTablePart=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;

}

}

}

}

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航