當資料不同時,C# Excel 程式的結構與邏輯就會非常重要。本篇將分享 C# Excel 資料處理優化的技巧,包含邏輯設計與程式結構改善,幫助你從「能用」進階到「符合客製化需求」。
我們再回顧一下,C# 讀取 Excel 教學|使用 NPOI 進行資料處理|C# Excel 系列 我們接到財務部門的同仁提出了一個需求,他們收到Excel的資料後,每次都要自己打開計算金額覺得很累,有沒有辦法請軟體工程師開發自動讀取Excel並計算裡面的金額加總?
目前我們已經會用程式的方式讀取Excel,只要把特定的金額欄位讀到後加總起來就可以達成財務部的需求,我們就趕快開始吧!
開始程式碼邏輯調整
1 . 開啟C# 讀取 Excel 教學:資料處理入門(NPOI)—— 轉職軟體工程師之路|Excel資料讀取 建立的程式

2 . 依據需求調整範例程式碼
財務部希望將Excel中所有的貨品價格加總,最後再把總金額顯示出來。

這時候我們就會想到我們的程式碼已經可以把每個格子(cell)的值讀取出來,現在只要把讀取到貨品價格的那欄裡面的數字都加總起來就可以。
讀取Excel格子數值的程式碼片段:
(範例版)
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
XSSFWorkbook workbook = new XSSFWorkbook(fs);
ISheet sheet = workbook.GetSheetAt(0);
for (int rowIndex = 0; rowIndex <= sheet.LastRowNum; rowIndex++)
{
IRow row = sheet.GetRow(rowIndex);
if (row != null)
{
for (int colIndex = 0; colIndex < row.LastCellNum; colIndex++)
{
ICell cell = row.GetCell(colIndex);
if (cell != null)
{
string cellValue = cell.ToString();
Console.WriteLine(cellValue);
}
}
}
}
}
(新版)
*(新增或修改的程式碼後面我會加//新增 或 //修改)
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
XSSFWorkbook workbook = new XSSFWorkbook(fs);
ISheet sheet = workbook.GetSheetAt(0);
int sumPrice = 0;//新增
for (int rowIndex = 1; rowIndex <= sheet.LastRowNum;rowIndex++)//修改
{
IRow row = sheet.GetRow(rowIndex);
if (row != null)
{
for (int colIndex = 0; colIndex < row.LastCellNum;colIndex++)
{
ICell cell = row.GetCell(colIndex);
if (cell != null)
{
string cellValue = cell.ToString();
Console.WriteLine(cellValue);
}
if(colIndex==4)//新增
{//新增
string cellValue = cell.ToString();//新增
int cellPrice = int.Parse(cellValue);//新增
sumPrice = sumPrice + cellPrice;//新增
}//新增
}
}
}
}
我們在讀取格子(cell)迴圈一個一個把格子的資料讀出來,我們需要加總的是第5欄貨品價格裡面的數值,因此我們在colIndex = 4 的時候,把cellValue取得的內容轉換成int(整數)相加,等到整個Excel全部讀完後,這些加總的數字就是這張Excel的總貨品價格。
新增或更改的程式碼:
新增程式碼:
int sumPrice = 0;
-------------------------------------------------------------------------------------------------------
先新增一個整數容器 ,用來相加貨品價格。
修改程式碼:
for (int rowIndex = 1; rowIndex <= sheet.LastRowNum; rowIndex++)
-------------------------------------------------------------------------------------------------------
原本int rowIndex = 0 這裡改成 int rowIndex = 1 ,因為我們Excel的第一列(Row)是標頭,不會有貨品價格,所以直接跳過第一列即可。
新增程式碼:
if(colIndex==4)
-------------------------------------------------------------------------------------------------------
用來判斷是否到第4個cell,如果到第4個cell再開始進入我們 if {}裡面做數字相加。
新增程式碼:
string cellValue = cell.ToString();
-------------------------------------------------------------------------------------------------------
取出格子(cell)裡面的值。
新增程式碼:
int cellPrice = int.Parse(cellValue);
-------------------------------------------------------------------------------------------------------
將取到的格子裡面的值cellValue 轉換成整數的型態,儲存到cellPrice裡面,到時候才能做數字加總。
int.Parse是.net提供的語法,Parse字面上的意思是解析,所以這個用法就是把值cellValue做整數(int)的轉換。
新增程式碼:
sumPrice = sumPrice + cellPrice;
-------------------------------------------------------------------------------------------------------
將sumPrice每次都等於之前的值加上每一格貨品價格cellPrice。
結論
用新版的程式跑完後sumPrice就會是所有的貨品價格加總,我們也順利完成財務部的需求了!















