C#利用Openxml读取Excel数据实例
程序员文章站
2023-12-16 16:54:40
本文实例讲述了c#利用openxml读取excel数据的方法,分享给大家供大家参考。具体分析如下:
这里有些问题,如果当cell 里面是 日期和浮点型的话,对应的cell...
本文实例讲述了c#利用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获取后日期会被自动转换为浮点型]
参考代码如下:
using system; using system.collections.generic; using system.data; using system.linq; using system.text; using system.threading.tasks; using documentformat.openxml.packaging; using documentformat.openxml.spreadsheet; namespace readexcel { public class program { static void main(string[] args) { datatable dt = new datatable(); using (spreadsheetdocument spreadsheetdocument = spreadsheetdocument.open(@"test.xlsx", false)) { workbookpart workbookpart = spreadsheetdocument.workbookpart; ienumerable<sheet> sheets = spreadsheetdocument.workbookpart.workbook.getfirstchild<sheets>().elements<sheet>(); string relationshipid = 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(); // 设置表头datatable foreach (cell cell in rows.elementat(0)) { dt.columns.add((string)getcellvalue(spreadsheetdocument, cell)); } // 添加内容 for (int rowindex = 1; rowindex < rows.count(); rowindex++) { datarow temprow = dt.newrow(); for (int i = 0; i < rows[rowindex].descendants<cell>().count(); i++) { temprow[i] = getcellvalue(spreadsheetdocument, rows[rowindex].descendants<cell>().elementat(i)); } dt.rows.add(temprow); } } console.readkey(); } public static string getcellvalue(spreadsheetdocument document, cell cell) { sharedstringtablepart stringtablepart = document.workbookpart.sharedstringtablepart; string value = cell.cellvalue.innerxml; if (cell.datatype != null && (cell.datatype.value == cellvalues.sharedstring || cell.datatype.value == cellvalues.string || cell.datatype.value == cellvalues.number)) { return stringtablepart.sharedstringtable.childelements[int32.parse(value)].innertext; } else //浮点数和日期对应的cell.datatype都为null { // datetime.fromoadate((double.parse(value)); 如果确定是日期就可以直接用过该方法转换为日期对象,可是无法确定datatype==null的时候这个cell 数据到底是浮点型还是日期.(日期被自动转换为浮点 return value; } } } }
希望本文所述对大家的c#程序设计有所帮助.