当前位置: 移动技术网 > IT编程>开发语言>c# > C#利用Openxml读取Excel数据实例

C#利用Openxml读取Excel数据实例

2019年07月18日  | 移动技术网IT编程  | 我要评论

本文实例讲述了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#程序设计有所帮助.

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网