C#教程之NPOI讀寫excel文件XLS,XLSX格式

NPOI 是開源的 POI 項目的.NET版,可以用來讀寫Excel,Word,PPT文件。

僅需處理 XLS/XLSX 格式的文本和數字讀寫,最少需要加載?2 個核心 DLL

  1. NPOI.dll
    包含所有格式的通用接口(IWorkbookISheetIRowICell?等),是 NPOI 的基礎核心庫。

  2. 對應格式的專用 DLL

    • 處理 XLS(97-2003):需?NPOI.HSSF.dll
    • 處理 XLSX(2007+):需?NPOI.XSSF.dll

如果同時需要支持兩種格式,則需要加載?3 個 DLLNPOI.dll?+?NPOI.HSSF.dll?+?NPOI.XSSF.dll。說明:

  • 不需要額外引用?NPOI.HPSF.dll(處理 OLE2 文檔屬性,基礎讀寫用不到)。
  • 不需要?NPOI.DDF.dllNPOI.POIFS.dll?等(這些用于復雜功能如圖片、公式、加密等)。
  • 若使用 NuGet 安裝?NPOI?包,會自動包含所有依賴,但實際運行時僅上述核心 DLL 是必須的。

對于簡單的文本和數字讀寫,這幾個 DLL 足以滿足需求。

在處理Excel文件上,NPOI 可以同時兼容 xls 和 xlsx。

官網提供了一份 Examples,? ? ?給出了很多應用場景的例子,打包好的二進制文件類庫,也僅有幾MB,使用非常方便。? ? ?讀Excel

{IWorkbook wk = null;string extension = System.IO.Path.GetExtension(filePath);try{FileStream fs = File.OpenRead(filePath);if (extension.Equals(".xls")){//把xls文件中的數據寫入wk中wk = new HSSFWorkbook(fs);}else{//把xlsx文件中的數據寫入wk中wk = new XSSFWorkbook(fs);}fs.Close();//讀取當前表數據ISheet sheet = wk.GetSheetAt(0);IRow row = sheet.GetRow(0);  //讀取當前行數據//LastRowNum 是當前表的總行數-1(注意)int offset = 0;for (int i = 0; i <= sheet.LastRowNum; i++){row = sheet.GetRow(i);  //讀取當前行數據if (row != null){//LastCellNum 是當前行的總列數for (int j = 0; j < row.LastCellNum; j++){//讀取該行的第j列數據string value = row.GetCell(j).ToString();Console.Write(value.ToString() + " ");}Console.WriteLine("\n");}}}catch (Exception e){//只在Debug模式下才輸出Console.WriteLine(e.Message);}
}
在這里插入代碼片

Excel中的單元格是有不同數據格式的,例如數字,日期,字符串等,在讀取的時候可以根據格式的不同設置對象的不同類型,方便后期的數據處理。

//獲取cell的數據,并設置為對應的數據類型
public object GetCellValue(ICell cell)
{object value = null;try{if (cell.CellType != CellType.Blank){switch (cell.CellType){case CellType.Numeric:// Date comes hereif (DateUtil.IsCellDateFormatted(cell)){value = cell.DateCellValue;}else{// Numeric typevalue = cell.NumericCellValue;}break;case CellType.Boolean:// Boolean typevalue = cell.BooleanCellValue;break;case CellType.Formula:value = cell.CellFormula;break;default:// String typevalue = cell.StringCellValue;break;}}}catch (Exception){value = "";}return value;
}

AI寫代碼csharp運行

特別注意的是CellType中沒有Date,而日期類型的數據類型是Numeric,其實日期的數據在Excel中也是以數字的形式存儲。可以使用DateUtil.IsCellDateFormatted方法來判斷是否是日期類型。

有了GetCellValue方法,寫數據到Excel中的時候就要有SetCellValue方法,缺的類型可以自己補。

//根據數據類型設置不同類型的cell
public static void SetCellValue(ICell cell, object obj)
{if (obj.GetType() == typeof(int)){cell.SetCellValue((int)obj);}else if (obj.GetType() == typeof(double)){cell.SetCellValue((double)obj);}else if (obj.GetType() == typeof(IRichTextString)){cell.SetCellValue((IRichTextString)obj);}else if (obj.GetType() == typeof(string)){cell.SetCellValue(obj.ToString());}else if (obj.GetType() == typeof(DateTime)){cell.SetCellValue((DateTime)obj);}else if (obj.GetType() == typeof(bool)){cell.SetCellValue((bool)obj);}else{cell.SetCellValue(obj.ToString());}
}

cell.SetCellValue()方法只有四種重載方法,參數分別是string, bool, DateTime, double, IRichTextString
設置公式使用cell.SetCellFormula(string formula)寫Excel

以下是簡單的例子,更多信息可以參見官網提供的Examples。

public void WriteToExcel(string filePath)
{
//創建工作薄
IWorkbook wb;
string extension = System.IO.Path.GetExtension(filePath);
//根據指定的文件格式創建對應的類
if (extension.Equals(".xls"))
{
wb = new HSSFWorkbook();
}
else
{
wb = new XSSFWorkbook();
}
ICellStyle style1 = wb.CreateCellStyle();//樣式
style1.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left;//文字水平對齊方式
style1.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//文字垂直對齊方式
//設置邊框
style1.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
style1.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
style1.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
style1.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
style1.WrapText = true;//自動換行ICellStyle style2 = wb.CreateCellStyle();//樣式
IFont font1 = wb.CreateFont();//字體
font1.FontName = "楷體";
font1.Color = HSSFColor.Red.Index;//字體顏色
font1.Boldweight = (short)FontBoldWeight.Normal;//字體加粗樣式
style2.SetFont(font1);//樣式里的字體設置具體的字體樣式//設置背景色
style2.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Yellow.Index;
style2.FillPattern = FillPattern.SolidForeground;
style2.FillBackgroundColor = NPOI.HSSF.Util.HSSFColor.Yellow.Index;
style2.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left;//文字水平對齊方式
style2.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//文字垂直對齊方式ICellStyle dateStyle = wb.CreateCellStyle();//樣式
dateStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left;//文字水平對齊方式
dateStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//文字垂直對齊方式
//設置數據顯示格式
IDataFormat dataFormatCustom = wb.CreateDataFormat();
dateStyle.DataFormat = dataFormatCustom.GetFormat("yyyy-MM-dd HH:mm:ss");//創建一個表單
ISheet sheet = wb.CreateSheet("Sheet0");
//設置列寬
int[] columnWidth = { 10, 10, 20, 10 };
for (int i = 0; i < columnWidth.Length; i++)
{//設置列寬度,256*字符數,因為單位是1/256個字符sheet.SetColumnWidth(i, 256 * columnWidth[i]);
}//測試數據
int rowCount = 3, columnCount = 4;
object[,] data = {{"列0", "列1", "列2", "列3"},{"", 400, 5.2, 6.01},{"", true, "2014-07-02", DateTime.Now}//日期可以直接傳字符串,NPOI會自動識別//如果是DateTime類型,則要設置CellStyle.DataFormat,否則會顯示為數字
};IRow row;
ICell cell;for (int i = 0; i < rowCount; i++)
{row = sheet.CreateRow(i);//創建第i行for (int j = 0; j < columnCount; j++){cell = row.CreateCell(j);//創建第j列cell.CellStyle = j % 2 == 0 ? style1 : style2;//根據數據類型設置不同類型的cellobject obj = data[i, j];SetCellValue(cell, data[i, j]);//如果是日期,則設置日期顯示的格式if (obj.GetType() == typeof(DateTime)){cell.CellStyle = dateStyle;}//如果要根據內容自動調整列寬,需要先setCellValue再調用//sheet.AutoSizeColumn(j);}
}//合并單元格,如果要合并的單元格中都有數據,只會保留左上角的//CellRangeAddress(0, 2, 0, 0),合并0-2行,0-0列的單元格
CellRangeAddress region = new CellRangeAddress(0, 2, 0, 0);
sheet.AddMergedRegion(region);try
{FileStream fs = File.OpenWrite(filePath);wb.Write(fs);//向打開的這個Excel文件中寫入表單并保存。  fs.Close();
}
catch (Exception e)
{Debug.WriteLine(e.Message);
}

如果想要設置單元格為只讀或可寫,可以參考,方法如下:

ICellStyle unlocked = wb.CreateCellStyle();
unlocked.IsLocked = false;//設置該單元格為非鎖定
cell.SetCellValue("未被鎖定");
cell.CellStyle = unlocked;
...
//保護表單,password為解鎖密碼//cell.CellStyle.IsLocked = true;的單元格將為只讀
sheet.ProtectSheet("password");

cell.CellStyle.IsLocked 默認就是true,

因此sheet.ProtectSheet(“password”)一定要執行,

才能實現鎖定單元格,對于不想鎖定的單元格,

就一定要設置cell的CellStyle中的IsLocked = false

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918727.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918727.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918727.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Perforce P4 Git 連接器

Perforce P4 Git連接器將Git代碼庫與數字資產集中存儲于Perforce P4&#xff08;前身為Helix Core&#xff09;&#xff0c;為所有數字資產&#xff08;源碼二進制文件&#xff09;構建單一事實來源。 突破代碼庫與文件限制 當藝術家、開發者及工程師組成的大型團隊僅使用Git時…

day10_尋找用戶推薦人

一、題目給出一張customer表&#xff0c;里面有id&#xff08;客戶id&#xff09;——主鍵&#xff0c;name&#xff08;客戶姓名&#xff09;&#xff0c;referee_id&#xff08;推薦人客戶id&#xff09;三個字段二、題目要求1、找出被id不是2的用戶推薦的客戶姓名2、沒有被任…

python爬蟲(三)----Selenium

目錄 1. Selenium 1.1 Selenium是啥 1.2 安裝chrom Driver 1.3 selenium 使用 1.4 selenium元素定位 1.5 訪問元素信息 1.6 交互 2. Phantomjs、Chrom handless 1. Selenium 1.1 Selenium是啥 自動化Web瀏覽器操作 主要用于Web應用程序的測試 支持多操作系統、多瀏覽器…

《事務隔離級別與 MVCC 機制深度剖析》

&#x1f50d; 事務隔離級別與 MVCC 機制深度剖析 &#x1f9e0; 前言 在高并發場景下&#xff0c;數據庫事務是保證數據一致性的基石。但在 MySQL InnoDB 中&#xff0c;事務的隔離級別、鎖策略、MVCC&#xff08;多版本并發控制&#xff09;之間的配合&#xff0c;常常是面…

20250814,通義萬相,無限生成權限(慢速)

今天看小紅書&#xff0c;發現通義萬相可以免費生成慢速圖片。研究一下每天10分用完后&#xff0c;按鈕就變成0&#xff0c;但是可以點擊這個0&#xff0c;進入排隊慢速生成狀態。原來通義萬相的收費主要是用來提速的&#xff08;快速出圖&#xff09;&#xff0c;不著急的話也…

Salesforce方案:醫療行業“患者隨訪與健康管理”

醫療行業“患者隨訪與健康管理”的Salesforce方案設計 一、業務需求核心解析 醫療行業患者隨訪與健康管理需實現三大目標&#xff1a; 全周期健康記錄&#xff1a;整合患者基本信息、病史、診療記錄及檢查結果&#xff0c;形成完整健康檔案個性化隨訪計劃&#xff1a;基于病種和…

vscode使用keil5出現變量跳轉不了

vscode使用keil5出現變量跳轉不了&#xff0c;或者未包含文件&#xff0c;或者未全局檢索&#xff1b; 參考如下文章后還會出現&#xff1b; 為什么vscode搜索欄只搜索已經打開的文件_vscode全局搜索只能搜當前文件-CSDN博客 在機緣巧合之下發現如下解決方式&#xff1a; 下載…

如何查看SQL Server的當前端口

想知道SQL Server用的是哪個端口&#xff1f; 很簡單&#xff0c;通過注冊表就能查到。第一步&#xff1a;打開注冊表按下 Win R&#xff0c;輸入&#xff1a;regedit回車&#xff0c;打開注冊表編輯器。第二步&#xff1a;找到路徑HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSS…

常見的Jmeter壓測問題

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快根據在之前的壓測過程碰到的問題&#xff0c;今天稍微總結總結&#xff0c;以后方便自己查找。一、單臺Mac進行壓測時候&#xff0c;壓測客戶端Jmeter啟動超過2000個…

第二十三天:求逆序對

每日一道C題&#xff1a; 問題&#xff1a;給定一個序列a1,a2,…,an&#xff0c;如果存在i<j并且ai>aj&#xff0c;那么我們稱之為逆序對&#xff0c;求逆序對的數目。 要求&#xff1a;輸入第一行為n,表示序列長度&#xff0c;接下來的n行&#xff0c;第i1行表示序列中的…

Java—CompletableFuture 詳解

參考&#xff1a; CompletableFuture原理與實踐-外賣商家端API的異步化 - 美團技術團隊 CompletableFuture 詳解 | JavaGuide 1.CompletableFuture介紹 CompletableFuture是由Java 8引入的&#xff0c;在Java8之前我們一般通過Future實現異步。 Future用于表示異步計算的結…

大模型部署基礎設施搭建 - 向量數據庫milvus

一、docker方式安裝參考官網&#xff1a;https://milvus.io/docs/zh/install_standalone-docker.md#Install-Milvus-in-Docker1.1 安裝 curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.shbash standal…

(25.08)Ubuntu20.04復現KISS-ICP

主頁&#xff1a;https://github.com/PRBonn/kiss-icp?tabreadme-ov-file 倉庫&#xff1a;https://github.com/PRBonn/kiss-icp.git 非 ROS 使用流程 1. 克隆倉庫 git clone https://github.com/PRBonn/kiss-icp.git cd kiss-icp 2. 使用 micromamba 創建 Python 虛擬環…

linux 軟硬鏈接詳解

一、核心區別總覽特性硬鏈接&#xff08;Hard Link&#xff09;軟鏈接&#xff08;Symbolic Link&#xff09;本質直接指向文件的 inode&#xff08;數據塊的入口地址&#xff09;指向文件的 路徑名&#xff08;相當于快捷方式&#xff09;跨文件系統支持? 僅限同一文件系統?…

基于SpringBoot+Vue的房屋匹配系統(WebSocket實時通訊、協同過濾算法、地圖API、Echarts圖形化分析)

&#x1f388;系統亮點&#xff1a;WebSocket實時通訊、協同過濾算法、地圖API、Echarts圖形化分析&#xff1b;一.系統開發工具與環境搭建1.系統設計開發工具后端使用Java編程語言的Spring boot框架 項目架構&#xff1a;B/S架構 運行環境&#xff1a;win10/win11、jdk17前端&…

第2節:多模態的核心問題(多模態大模型基礎教程)

前言 本節課我們聚焦多模態大模型最核心的問題&#xff1a;文本、圖像、語音這些“不同語言”的信息&#xff0c;是怎么被模型“翻譯”并互相理解的&#xff1f;我們從“差異”入手&#xff0c;一步步搞懂其中的邏輯。 一、先搞懂&#xff1a;什么是“模態差異”&#xff1f; 生…

Java stream distinct findAny anyMatch實現 :DistinctOp、FindOp、MatchOp

DistinctOpsDistinctOps 是一個專門用于實現 Stream.distinct() 操作的工廠類。正如它的名字所示&#xff0c;它的核心職責就是創建能夠去除流中重復元素的操作。distinct() 是一個有狀態的中間操作 (stateful intermediate operation)&#xff0c;這意味著它通常需要看到所有元…

鎖的基本介紹

鎖 并發編程的一個最基本問題就是原子性地執行一系列指令。鎖有助于直接解決這一問題。 鎖的基本思想 鎖就是一個變量。這個變量保存了鎖在某一時刻的狀態。它要么是可用的&#xff0c;表示沒有線程持有鎖&#xff0c;要么是被占用的&#xff0c;表示有線程持有鎖&#xff0c;正…

【讀代碼】開源流式語音編碼器SecoustiCodec

引言:從LLM到深度語義 在大型語言模型(LLM)驅動的語音交互時代,神經語音編解碼器 (Neural Speech Codec) 扮演著至關重要的角色。它如同 LLM 的“耳朵”和“嘴巴”,負責將連續的語音波形轉換為離散的、可供模型處理的 token,并將模型生成的 token 還原為自然的人聲。 一…

P5967 [POI 2016] Korale 題解

P5967 [POI 2016] Korale 題目描述 有 nnn 個帶標號的珠子&#xff0c;第 iii 個珠子的價值為 aia_iai?。 現在你可以選擇若干個珠子組成項鏈&#xff08;也可以一個都不選&#xff09;&#xff0c;項鏈的價值為所有珠子的價值和。 給出所有可能的項鏈排序&#xff0c;先按…