iT邦幫忙

1

C# NPOI 匯出 Excel 語法詢問

  • 分享至 

  • xImage

不好意思想請問各位大神!
最近在寫C#使用NPOI將SQL查詢出來的資料匯成Excel檔案
但是發現匯出來的資料都會是文字型態,而有找過幾個網站試了他們的方法都沒有用
所以想說發上來詢問一下有沒有方法或是關鍵字可以找尋

https://ithelp.ithome.com.tw/upload/images/20221108/20150198C6QhAByoWc.png
這張圖是我使用SQL語法查詢出來的
語法如下

declare @todayYM varchar(6)
set @todayYM = convert(varchar(6),getdate()-8,112) /*當月8號前都可以查詢到上個月的資料*/

SELECT [TC001] AS 移轉單單別
	  ,[TC002] AS 移轉單單號
	  ,[TC003] AS 移轉單序號
	  ,[TC047] AS 產品品號
	  ,[TC038] AS 驗收日期
	  ,SUBSTRING([TC038],7,8) AS 驗收_日
	/*,DAY([TC038]) AS 驗收_日*/
	  ,(case [TC007] 
		when ' ' then ' '
		when '0010' then '10捲條'
		when '0020' then '20成型'
		when '0025' then '25組立前'
		when '0030' then '30組立'
		when '0040' then '40塗裝'
		when '0050' then '50包裝'
		else '61委外'
		end 
		) 製程
	  ,[TC007] AS 移出製程
	  ,[TC009] AS 移入製程
	  ,Convert(decimal(18,0),[TC014]) AS 移轉數量
FROM C

然後我的C#語法 是以下

SqlConnection conn = new SqlConnection("data source=x; initial catalog =y; user id =z; password =a");
conn.Open();
            
string savelocate = label6.Text + "\\";
string day = DateTime.Now.ToString("yyyyMMdd");

int rowIndex = 4;
            
string SQL_32 = "=====以上的語法=====";
            
SqlDataAdapter ap32 = new SqlDataAdapter(SQL_32, conn);
DataSet ds32 = new DataSet();
ap32.Fill(ds32, "xx表");
            
DataTable dt32 = ds32.Tables["xx表"];
            
string fileName9 = savelocate + day + "xx表" + ".xlsx";
            
XSSFWorkbook wb9 = new XSSFWorkbook(); //建立--活頁簿
ISheet sheet32 = wb9.CreateSheet("xx表");
            
//-----設定--xx表--樣式-----//
ICellStyle header_Style9 = wb9.CreateCellStyle();
IFont header_Font9 = wb9.CreateFont();

ICellStyle data_Left9 = wb9.CreateCellStyle();    //靠左對齊
ICellStyle data_Right9 = wb9.CreateCellStyle();   //靠右對齊
ICellStyle data_Center9 = wb9.CreateCellStyle();  //置中對齊
IFont data_Font9 = wb9.CreateFont();

ICellStyle data_Time9 = wb9.CreateCellStyle();

//匯入資料

sheet32.CreateRow(rowIndex);
for (int i = 0; i < dt32.Columns.Count; i++)
{
     sheet32.GetRow(rowIndex).CreateCell(i).SetCellValue(dt32.Columns[i].ColumnName);
    sheet32.SetAutoFilter(new CellRangeAddress(4, 4, 0, dt32.Columns.Count - 1));
    sheet32.GetRow(rowIndex).GetCell(i).CellStyle = data_Center9;
    sheet32.GetRow(rowIndex).Height = 25 * 20;
}

for (int i = 0; i < dt32.Rows.Count; i++)
{
    sheet32.CreateRow(i + 5);
    for (int j = 0; j < dt32.Columns.Count; j++)
    {
        sheet32.GetRow(i + 5).CreateCell(j).SetCellValue(dt32.Rows[i][j].ToString());
        sheet32.GetRow(i + 5).GetCell(j).CellStyle = data_Center9;
        sheet32.GetRow(i + 5).Height = 20 * 20;
    }
    sheet32.GetRow(i + 5).GetCell(1).CellStyle = data_Left9;
}


FileStream file9 = new FileStream(@fileName9, FileMode.Create);
wb9.Write(file9);
file9.Close();

不好意思程式碼可能有點長,但想要讓大家可以清楚一點我的格式所以才發出這麼多,想知道可以在哪邊加入合適的程式碼讓我移轉數量的欄位在匯出的Excel上可以是數值型態的。

有嘗試過的網頁如下
資料一
資料二
資料三
資料四

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
allenlwh
iT邦高手 1 級 ‧ 2022-11-08 11:54:39
最佳解答
XSSFWorkbook wb9 = new XSSFWorkbook(); //建立--活頁簿
ISheet sheet32 = wb9.CreateSheet("1108");
int rowIndex = 2;
sheet32.CreateRow(rowIndex);
sheet32.GetRow(rowIndex).CreateCell(5).SetCellValue(Convert.ToDouble("123"));
sheet32.GetRow(rowIndex).CreateCell(6).SetCellValue(Convert.ToDouble("123.45"));
sheet32.GetRow(rowIndex).CreateCell(7).SetCellValue(Convert.ToDouble("56.789"));
rowIndex++;
sheet32.CreateRow(rowIndex);
sheet32.GetRow(rowIndex).CreateCell(5).SetCellValue(Convert.ToDouble("456"));
sheet32.GetRow(rowIndex).CreateCell(6).SetCellValue(Convert.ToDouble("123.45"));
sheet32.GetRow(rowIndex).CreateCell(7).SetCellValue(Convert.ToDouble("56.789"));

string filename = @"d:\NPOI1108.xls";
FileStream file9 = new FileStream(filename, FileMode.Create);
wb9.Write(file9);
file9.Close();

https://ithelp.ithome.com.tw/upload/images/20221108/200334930MK46UQz8h.jpghttps://ithelp.ithome.com.tw/upload/images/20221108/20033493NzoctJeA4p.jpghttps://ithelp.ithome.com.tw/upload/images/20221108/20033493PoStRS0Vo2.jpg

HYHuang iT邦新手 5 級 ‧ 2022-11-09 11:48:52 檢舉

成功了,謝謝您的解答!

0
海綿寶寶
iT邦大神 1 級 ‧ 2022-11-08 11:33:06
sheet32.GetRow(i + 5).CreateCell(j).SetCellValue(dt32.Rows[i][j].ToString());

改成

if j==dt32.Columns.Count-1 {
    sheet32.GetRow(i + 5).CreateCell(j).SetCellValue(dt32.Rows[i][j]);
} else {
    sheet32.GetRow(i + 5).CreateCell(j).SetCellValue(dt32.Rows[i][j].ToString());
}

試看看

HYHuang iT邦新手 5 級 ‧ 2022-11-08 11:47:14 檢舉

感謝回覆!
https://ithelp.ithome.com.tw/upload/images/20221108/201501987oPzkr5QpW.png
目前改成以上這樣,因為怕格式可能會影響到所以我都先去除了,不過目前還是不行,還是會呈現以下的這個文字型態。
https://ithelp.ithome.com.tw/upload/images/20221108/201501986jmZxcCJD5.png

改成以上這樣

這樣改等於沒改
由於迴圈寫的是j<dt32.Columns.Count
以致於迴圈裡面的if j==dt32.Columns.Count沒機會成立

HYHuang iT邦新手 5 級 ‧ 2022-11-09 11:46:34 檢舉

了解了,可能當時腦袋還沒有轉過來。
目前的話我的疑惑解決了,有使用到海綿寶寶您的用法,不過還是要把資料型態改成數字型態才行,我參考了一樓 allenlwh的方法,所以程式碼改成以下。

if (j == dt32.Columns.Count-1)
{
    sheet32.GetRow(i + 5).CreateCell(j).SetCellValue(Convert.ToDouble(dt32.Rows[i][j].ToString()));
    sheet32.GetRow(i + 5).GetCell(j).CellStyle = data_money9;
    sheet32.GetRow(i + 5).Height = 20 * 20;
}
else
{
    sheet32.GetRow(i + 5).CreateCell(j).SetCellValue(dt32.Rows[i][j].ToString());
    sheet32.GetRow(i + 5).GetCell(j).CellStyle = data_Center9;
    sheet32.GetRow(i + 5).Height = 20 * 20;
}

這樣就成功囉,謝謝你們的回覆!!

我要發表回答

立即登入回答