0.介紹
ClosedXML 是一个开源的 .NET 库,用于创建、读取和操作 Excel 文件,而 ClosedXML.Excel 命名空间则提供了与 Excel 文件相关的各种类和方法,例如 XLWorkbook、IXLWorksheet 等。
通过将 using ClosedXML.Excel; 放在代码文件的顶部,可以让你在代码中直接使用 ClosedXML.Excel 命名空间中的类型和成员,而不需要每次都写完整的命名空间路径。这样可以使代码更加简洁和易读。
XLSX 是 Microsoft Excel 使用的一种文件格式,用于存储电子表格。它代表着“Excel 开放式 XML 电子表格”,并于 Microsoft Office 2007 发布时引入。XLSX 文件实际上是包含代表电子表格内容、格式和其他数据的 XML 文件的 ZIP 归档文件。
XLSX 格式相比其前身 XLS(用于旧版本 Excel 的二进制格式)具有多种优势,包括更好地与其他软件和平台兼容、更小的文件大小以及支持更多功能,例如更大的工作表和改进的安全性。
由于 XLSX 文件实质上是 ZIP 归档文件,因此可以使用诸如 ClosedXML 这样的库对其进行编程处理,从而简化读取、写入和修改 Excel 文件等任务,而无需在系统上安装 Excel。这使得开发人员能够更轻松地在其应用程序中处理 Excel 文件,尤其是在 Excel 可能不可用或不实用的环境中。
1.觸發導出事件
觸發導出事件,選擇文件存放位置,後續提供無模板和有模板兩種導出方式
/// <summary>
/// 輸出按鈕點擊事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOutput_Click(object sender, EventArgs e)
{
// 選擇輸出路徑
FileUtils file_utils = new FileUtils("子SKU在庫データ" + Consts.Strings.File.SELECT_OUTPUT_PATH);
var path = file_utils.ShowFolderBrowserDialog();
if (path != null)
{
try
{
Cursor.Current = Cursors.WaitCursor;
// 文件輸出處理
OutputChildStockList(path);
Utils.ShowAlertForm(Consts.Strings.File.OUTPUT_SUCCESS, Consts.Strings.Control.BUTTON_OK);
}
catch (Exception ex)
{
ErrorLog.Output(ex, (int)_session.id);
Utils.ShowAlertForm(Strings.File.OUTPUT_FAILE, Strings.Control.BUTTON_OK);
return;
}
finally
{
Cursor.Current = Cursors.Default;
}
}
}
2.無模板
using ClosedXML.Excel;
/// <summary>
/// 將表格內容輸出到 XLSX 檔案中
/// </summary>
/// <param name="output_path"></param>
private void OutputChildStockList(string output_path)
{
// 建立新的 Excel 工作簿
using (var workbook = new XLWorkbook())
{
// 新增工作表
var worksheet = workbook.Worksheets.Add();
// 寫入標題列
for (int i = 0; i < grdArrivals.Columns.Count; i++)
{
worksheet.Cell(1, i + 1).Value = grdArrivals.Columns[i].HeaderText;
}
// 寫入資料至儲存格
int current_row = 2;
var rows = ((DataTable)this.grdArrivals.DataSource).Rows;
foreach (DataRow row in rows)
{
worksheet.Cell(current_row, 1).Value = row["arrival_date"].ToString();
worksheet.Cell(current_row, 2).Value = row["sku_number"].ToString();
worksheet.Cell(current_row, 3).Value = row["child_name"].ToString();
worksheet.Cell(current_row, 4).Value = row["quantity"].ToString();
worksheet.Cell(current_row, 5).Value = Convert.ToDateTime(row["best_by_date"]).ToString("yyyy/MM/dd");
worksheet.Cell(current_row, 6).Value = row["lot_no"].ToString();
worksheet.Cell(current_row, 7).Value = row["location"].ToString();
current_row++;
}
// 儲存工作簿
var start = dtpStart.Value.ToString("yyyyMMdd");
var end = dtpEnd.Value.ToString("yyyyMMdd");
string output_file = Path.Combine(output_path, $"入荷実績履歴_{start}-{end}.xlsx");
workbook.SaveAs(output_file);
}
}
3.有模板
*備注: 模板文件為 .xltx結尾的excel文件,可以新建excel普通文件,然後另外存為 文件名.xltx 文件即可
using ClosedXML.Excel;
/// <summary>
/// 將表格內容輸出到 XLSX 檔案中
/// </summary>
/// <param name="output_path"></param>
private void OutputChildStockList(string output_path)
{
// 模板檔案路徑 此處自定義,只要找得到自定義模板即可
// 模板檔案路徑 : ./template/child_stock.xltx
string template_path = Paths.PATH_TEMPLATE_CHILD_STOCK;
// 讀取模板檔案
using (var workbook = new XLWorkbook(template_path))
{
// 從模板檔案中取得工作表(第一個工作表)
var worksheet = workbook.Worksheet(1);
// 將 DataGridView 的資料寫入工作表
int start_row = 2; // 開始寫入的列
int current_row = start_row;
var rows = ((DataTable)this.grdStock.DataSource).Rows;
foreach (DataRow row in rows)
{
//此處并非必須,如果不需要背景顔色可注釋
// 根據狀態ID設定儲存格背景顏色
var status = Convert.ToInt32(row["status_number"]);
XLColor color = XLColor.NoColor;
if (status == 1)
{
// 淺黃色
color = XLColor.FromArgb(255, 255, 204);
}
else if (status == 2)
{
// 抹茶色
color = XLColor.FromArgb(169, 208, 142);
}
else if (status == 3)
{
// 水色
color = XLColor.FromArgb(204, 255, 255);
}
// 設定背景色
for (int i = 1; i < 10; i++)
{
worksheet.Cell(current_row, i).Style.Fill.BackgroundColor = color;
}
// 將資料寫入儲存格
worksheet.Cell(current_row, 1).Value = row["sku_number"].ToString();
worksheet.Cell(current_row, 2).Value = row["name"].ToString();
worksheet.Cell(current_row, 3).Value = "商業品";
worksheet.Cell(current_row, 4).Value = Convert.ToDateTime(row["best_by_date"]).ToString("yyyy/MM/dd");
worksheet.Cell(current_row, 5).Value = row["lot_no"].ToString();
worksheet.Cell(current_row, 6).Value = row["warehouse_name"].ToString();
worksheet.Cell(current_row, 7).Value = row["location"].ToString();
worksheet.Cell(current_row, 8).Value = Convert.ToInt32(row["logical_quantity"]);
worksheet.Cell(current_row, 9).Value = row["states_name"].ToString();
current_row += 1;
}
// 儲存工作簿
string output_file = output_path + "\\" + DateTime.Now.ToString("yyMMddHHmmsss") + "換算在庫.xlsx";
workbook.SaveAs(output_file);
}
}