最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#利用Openxml讀取Excel數(shù)據(jù)實(shí)例

 更新時(shí)間:2014年09月24日 09:36:34   投稿:shichen2014  
這篇文章主要介紹了C#利用Openxml讀取Excel數(shù)據(jù)的方法,包括使用中的注意點(diǎn)分析及疑難探討,需要的朋友可以參考下

本文實(shí)例講述了C#利用Openxml讀取Excel數(shù)據(jù)的方法,分享給大家供大家參考。具體分析如下:

這里有些問(wèn)題,如果當(dāng)Cell 里面是 日期和浮點(diǎn)型的話(huà),對(duì)應(yīng)的Cell.DataType==Null,對(duì)應(yīng)的時(shí)間會(huì)轉(zhuǎn)換為一個(gè)浮點(diǎn)型,對(duì)于這塊可以通過(guò)DateTime.FromOADate(double d)轉(zhuǎn)換為時(shí)間。 可是缺點(diǎn)的地方就是,如果Cell.DataType ==NULL, 根本無(wú)法確認(rèn)這個(gè)數(shù)據(jù)到底是 浮點(diǎn)型還是[被轉(zhuǎn)換為了日期的浮點(diǎn)數(shù)]。查閱了很多國(guó)外資料,的確國(guó)外博客有一部分都反映了。有關(guān)Openxml讀取Excel時(shí)Cell.DataType==NULL的問(wèn)題。本例子沒(méi)考慮那個(gè)問(wèn)題,現(xiàn)在還沒(méi)解決。等后面查詢(xún)到更詳細(xì)的資料再解決。

其次解決這個(gè)問(wèn)題的方法只有,在數(shù)據(jù)處理的時(shí)候,數(shù)據(jù)分析我們是可以知道這一列的數(shù)據(jù)到底是什么類(lèi)型,然后根據(jù)自己的需求,自己對(duì)獲取的數(shù)據(jù)做相應(yīng)轉(zhuǎn)換處理。不過(guò)如果使用OleDb的Select語(yǔ)句來(lái)讀取Excel的時(shí)候,就不會(huì)出現(xiàn)這個(gè)問(wèn)題,讀取到Datable時(shí)候是日期就不會(huì)轉(zhuǎn)換為浮點(diǎn)型數(shù)據(jù)。而且對(duì)象的Datable對(duì)于的那個(gè)單元格數(shù)據(jù)還可以直接強(qiáng)制轉(zhuǎn)換為DateTime。不過(guò)用OleDB讀取數(shù)據(jù)感覺(jué)上應(yīng)該沒(méi)有Openxml目前還沒(méi)測(cè)試大數(shù)據(jù),太晚了。該sleep了。如果有大神了解Openxml讀取表格,請(qǐng)指點(diǎn)[需要解決問(wèn)題是:EXCEL的表格中CELL 的 DateTime類(lèi)型和浮點(diǎn)類(lèi)型數(shù)據(jù),在獲取后如何區(qū)分。因?yàn)槭褂肙penxml獲取后日期會(huì)被自動(dòng)轉(zhuǎn)換為浮點(diǎn)型]

參考代碼如下:

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();

        // 設(shè)置表頭DataTable
        foreach (Cell cell in rows.ElementAt(0))
        {
          dt.Columns.Add((string)GetCellValue(spreadSheetDocument, cell));
        }

        // 添加內(nèi)容
        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 //浮點(diǎn)數(shù)和日期對(duì)應(yīng)的cell.DataType都為NULL
      {
        // DateTime.FromOADate((double.Parse(value)); 如果確定是日期就可以直接用過(guò)該方法轉(zhuǎn)換為日期對(duì)象,可是無(wú)法確定DataType==NULL的時(shí)候這個(gè)CELL 數(shù)據(jù)到底是浮點(diǎn)型還是日期.(日期被自動(dòng)轉(zhuǎn)換為浮點(diǎn)
        return value;
      }
    }
  }
}

希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助.

相關(guān)文章

  • .NET中保證線程安全的高級(jí)方法Interlocked類(lèi)使用介紹

    .NET中保證線程安全的高級(jí)方法Interlocked類(lèi)使用介紹

    這篇文章主要介紹了.NET中保證線程安全的高級(jí)方法Interlocked類(lèi)使用介紹,Interlocked類(lèi)可以為為多個(gè)線程共享的變量提供原子操作,需要的朋友可以參考下
    2014-07-07
  • Unity工具類(lèi)ScrollView實(shí)現(xiàn)拖拽滑動(dòng)翻頁(yè)

    Unity工具類(lèi)ScrollView實(shí)現(xiàn)拖拽滑動(dòng)翻頁(yè)

    這篇文章主要為大家詳細(xì)介紹了Unity工具類(lèi)ScrollView實(shí)現(xiàn)拖拽滑動(dòng)翻頁(yè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C#多線程之Thread中Thread.Join()函數(shù)用法分析

    C#多線程之Thread中Thread.Join()函數(shù)用法分析

    這篇文章主要介紹了C#多線程之Thread中Thread.Join()函數(shù)用法,實(shí)例分析了Thread.Join()方法的原理與使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • C#圖片壓縮的實(shí)現(xiàn)方法

    C#圖片壓縮的實(shí)現(xiàn)方法

    一般在web應(yīng)用中,對(duì)客戶(hù)端提交上來(lái)的圖片肯定需要進(jìn)行壓縮的。尤其是比較大的圖片,如果不經(jīng)過(guò)壓縮會(huì)導(dǎo)致頁(yè)面變的很大,打開(kāi)速度比較慢,當(dāng)然了如果是需要高質(zhì)量的圖片也得需要生產(chǎn)縮略圖。
    2013-02-02
  • asp.net(C#)清除全部Session與單個(gè)Session的方法

    asp.net(C#)清除全部Session與單個(gè)Session的方法

    下面小編就為大家?guī)?lái)一篇asp.net(C#)清除全部Session與單個(gè)Session的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • NancyFx框架檢測(cè)任務(wù)管理器詳解

    NancyFx框架檢測(cè)任務(wù)管理器詳解

    這篇文章主要為大家詳細(xì)介紹了NancyFx框架檢測(cè)任務(wù)管理器的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • C#實(shí)現(xiàn)跑馬燈效果的示例代碼

    C#實(shí)現(xiàn)跑馬燈效果的示例代碼

    跑馬燈效果,功能效果大家應(yīng)該都知道,就是當(dāng)我們的文字過(guò)長(zhǎng),整個(gè)頁(yè)面放不下的時(shí)候(一般用于公告等),可以讓它自動(dòng)實(shí)現(xiàn)來(lái)回滾動(dòng)。本文將利用C#實(shí)現(xiàn)這一效果,感興趣的可以了解一下
    2022-11-11
  • C#公眾號(hào)開(kāi)發(fā)之給用戶(hù)發(fā)紅包

    C#公眾號(hào)開(kāi)發(fā)之給用戶(hù)發(fā)紅包

    這篇文章主要為大家詳細(xì)介紹了C#公眾號(hào)開(kāi)發(fā)之給用戶(hù)發(fā)紅包,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 使用C#對(duì)JSON進(jìn)行序列化和反序列化處理的兩種方法

    使用C#對(duì)JSON進(jìn)行序列化和反序列化處理的兩種方法

    本指南探討了如何使用 C# 編程語(yǔ)言進(jìn)行 JSON 序列化和反序列化,我們將介紹 .NET 生態(tài)系統(tǒng)中可用的兩個(gè)本機(jī)選項(xiàng),即命名空間和廣泛使用的 Newtonsoft.Json 庫(kù)(也稱(chēng)為 Json.NET),需要的朋友可以參考下
    2024-06-06
  • c# 類(lèi)成員初始化順序的特殊情況

    c# 類(lèi)成員初始化順序的特殊情況

    這篇文章主要介紹了c# 類(lèi)成員初始化順序的特殊情況,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06

最新評(píng)論

改则县| 成都市| 孝昌县| 满城县| 江陵县| 金溪县| 彩票| 天柱县| 鹰潭市| 宝兴县| 龙里县| 策勒县| 台中县| 阳原县| 包头市| 阿鲁科尔沁旗| 禄劝| 扎兰屯市| 鄄城县| 金堂县| 广安市| 东阳市| 通城县| 濮阳县| 西华县| 清水河县| 石河子市| 孟州市| 红河县| 芜湖市| 英吉沙县| 上饶县| 乐业县| 长春市| 徐州市| 临潭县| 玉树县| 海安县| 龙川县| 攀枝花市| 安义县|