首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 操作 Excel 生成報表(八):基於標記單元格的通用數據綁定

     編輯:關於C語言

設計思路

模板中用 $字段名 標記待填充單元格(如 $Name),程序掃描所有單元格,匹配標記並按 DataTable 列名填充,實現模板與代碼解耦。

模板示例

標記單元格模板截圖

  • A1: 標題
  • B1: $Name、D1: $Age、F1: $Memo

創建測試數據


private void BtnCreateXml_Click(object sender, EventArgs e)
{
    DataTable dt = new DataTable();
    dt.Columns.Add("Name", typeof(string));
    dt.Columns.Add("Age", typeof(int));
    dt.Columns.Add("Memo", typeof(string));
    dt.Rows.Add("dahuzizyd", 20, "dahuzizyd.cnblogs.com");
    dt.AcceptChanges();

    DataSet ds = new DataSet(); ds.Tables.Add(dt);
    ds.WriteXml(Application.StartupPath + @"\ExcelBindingXml.xml");
}

通用填充邏輯(核心)


private void BtnFillExcel_Click(object sender, EventArgs e)
{
    // 1. 讀取 XML 數據
    DataSet ds = new DataSet();
    ds.ReadXml(Application.StartupPath + @"\ExcelBindingXml.xml");
    DataTable dt = ds.Tables[0];
    DataRow dr = dt.Rows[0];

    // 2. 打開模板
    Excel.Application app = new Excel.Application();
    Excel._Workbook wb = app.Workbooks.Open(Application.StartupPath + @"\Template.xls", Missing.Value, ...);
    app.DisplayAlerts = false;
    Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets[1];

    // 3. 遍歷已使用區域
    Excel.Range used = ws.UsedRange;
    foreach (Excel.Range cell in used)
    {
        if (cell.Value2 is string txt && txt.StartsWith("$"))
        {
            string field = txt.Substring(1); // 去掉 $
            if (dt.Columns.Contains(field))
            {
                cell.Value = dr[field];
                cell.NumberFormatLocal = "@"; // 防止長數字科學計數法
            }
        }
    }

    // 4. 另存結果
    wb.SaveAs(Application.StartupPath + @"\Result.xls", ...);
    // 5. 清理 COM
    wb.Close(...); app.Quit();
    Marshal.ReleaseComObject(wb); Marshal.ReleaseComObject(app);
    GC.Collect(); GC.WaitForPendingFinalizers();
}

優勢

  • 模板設計者可隨意調整佈局、格式,無需修改代碼。
  • 新增字段只需在模板添加 $NewField 並確保 DataTable 有同名列。
  • 避免硬編碼單元格地址("B1"、"E2")帶來的維護噩夢。

擴展建議

  • 支持多行數據:按行複製模板行,填充每行。
  • 支持圖片綁定:標記 $Photo:Path,代碼識別插入圖片。
  • 性能優化:UsedRange.Value 讀取為 object[,] 內存處理後回寫,避免逐單元格 COM 呼叫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved