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

 更新时间:2014年09月24日 09:36:34   投稿:shichen2014  
这篇文章主要介绍了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<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#程序设计有所帮助.

相关文章

  • .NET中保证线程安全的高级方法Interlocked类使用介绍

    .NET中保证线程安全的高级方法Interlocked类使用介绍

    这篇文章主要介绍了.NET中保证线程安全的高级方法Interlocked类使用介绍,Interlocked类可以为为多个线程共享的变量提供原子操作,需要的朋友可以参考下
    2014-07-07
  • Unity工具类ScrollView实现拖拽滑动翻页

    Unity工具类ScrollView实现拖拽滑动翻页

    这篇文章主要为大家详细介绍了Unity工具类ScrollView实现拖拽滑动翻页,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C#多线程之Thread中Thread.Join()函数用法分析

    C#多线程之Thread中Thread.Join()函数用法分析

    这篇文章主要介绍了C#多线程之Thread中Thread.Join()函数用法,实例分析了Thread.Join()方法的原理与使用技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C#图片压缩的实现方法

    C#图片压缩的实现方法

    一般在web应用中,对客户端提交上来的图片肯定需要进行压缩的。尤其是比较大的图片,如果不经过压缩会导致页面变的很大,打开速度比较慢,当然了如果是需要高质量的图片也得需要生产缩略图。
    2013-02-02
  • asp.net(C#)清除全部Session与单个Session的方法

    asp.net(C#)清除全部Session与单个Session的方法

    下面小编就为大家带来一篇asp.net(C#)清除全部Session与单个Session的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • NancyFx框架检测任务管理器详解

    NancyFx框架检测任务管理器详解

    这篇文章主要为大家详细介绍了NancyFx框架检测任务管理器的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • C#实现跑马灯效果的示例代码

    C#实现跑马灯效果的示例代码

    跑马灯效果,功能效果大家应该都知道,就是当我们的文字过长,整个页面放不下的时候(一般用于公告等),可以让它自动实现来回滚动。本文将利用C#实现这一效果,感兴趣的可以了解一下
    2022-11-11
  • C#公众号开发之给用户发红包

    C#公众号开发之给用户发红包

    这篇文章主要为大家详细介绍了C#公众号开发之给用户发红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • 使用C#对JSON进行序列化和反序列化处理的两种方法

    使用C#对JSON进行序列化和反序列化处理的两种方法

    本指南探讨了如何使用 C# 编程语言进行 JSON 序列化和反序列化,我们将介绍 .NET 生态系统中可用的两个本机选项,即命名空间和广泛使用的 Newtonsoft.Json 库(也称为 Json.NET),需要的朋友可以参考下
    2024-06-06
  • c# 类成员初始化顺序的特殊情况

    c# 类成员初始化顺序的特殊情况

    这篇文章主要介绍了c# 类成员初始化顺序的特殊情况,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06

最新评论