栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

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

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

本文实例讲述了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 sheets = spreadSheetdocument.WorkbookPart.Workbook.GetFirstChild().Elements();
 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();
 Row[] rows = sheetData.Descendants().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().Count(); i++)
   {
     tempRow[i] = GetCellValue(spreadSheetdocument, rows[rowIndex].Descendants().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#程序设计有所帮助.

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/126055.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号