DataGridView 數據導出到excel方法

159 阅读3分钟

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