FarPoint Spread(現屬 GrapeCity)是 ASP.NET Web Forms 時代最強大的類 Excel 控件。本文匯總實戰高頻操作:模板開啟/保存、服務端數據填充、前台編輯事件處理、客戶端部署避坑。
// 頁面初始化或按鈕事件中
FpSpread1.OpenExcel(Server.MapPath("~/Report/Template.xlsx"));
// 核心屬性設定
FpSpread1.Sheets[0].AllowPage = false; // 禁用分頁,顯示所有行
FpSpread1.Sheets[0].AutoCalculation = true; // 自動計算公式
FpSpread1.UseClipboard = false; // 禁用複製貼上(防數據洩露)
FpSpread1.Sheets[0].OperationMode = FarPoint.Web.Spread.OperationMode.RowMode; // 整行編輯模式
FpSpread1.CommandBar.Visible = false; // 隱藏工具欄
FpSpread1.RenderCSSClass = "spread-style"; // 自定義 CSS 類
string savePath = Server.MapPath("~/Output/Result_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx");
bool ok = FpSpread1.SaveExcel(savePath);
if (!ok)
{
// 常見原因排查:
// 1. IIS_IUSRS / ApplicationPoolIdentity 無寫入權限 → 給目錄授予 Modify 權限
// 2. 缺少 fp_client 客戶端腳本資源 → 見下文部署章節
}
// 開啟模板
FpSpread1.OpenExcel(Server.MapPath("~/Template/Invoice.xlsx"));
FpSpread1.Sheets[0].AllowPage = false;
FpSpread1.Sheets[0].AutoCalculation = true;
var sheet = FpSpread1.Sheets[0];
// 寫入表頭
sheet.Cells[0, 0].Text = "銷售報表";
sheet.Cells[1, 0].Text = "日期:";
sheet.Cells[1, 1].Text = DateTime.Now.ToString("yyyy-MM-dd");
// 批量填充明細行
DataTable dt = GetSalesData(); // 你的數據源
for (int row = 0; row < dt.Rows.Count; row++)
{
int r = row + 3; // 從第4行開始
sheet.Cells[r, 0].Text = dt.Rows[row]["ProductName"].ToString();
sheet.Cells[r, 1].Value = Convert.ToDecimal(dt.Rows[row]["Quantity"]);
sheet.Cells[r, 2].Value = Convert.ToDecimal(dt.Rows[row]["UnitPrice"]);
sheet.Cells[r, 3].Formula = $"B{r+1}*C{r+1}"; // 設置公式:數量*單價
sheet.Cells[r, 3].Locked = true; // 公式列鎖定,禁止用戶修改
}
// 設置列寬
sheet.Columns[0].Width = 300;
sheet.Columns[1].Width = 80;
sheet.Columns[2].Width = 100;
sheet.Columns[3].Width = 100;
用戶在瀏覽器修改儲存格後點擊「更新」按鈕觸發。
<FarPoint:FpSpread ID="FpSpread1" runat="server" OnUpdateCommand="FpSpread1_UpdateCommand" />
protected void FpSpread1_UpdateCommand(object sender, FarPoint.Web.Spread.SpreadCommandEventArgs e)
{
// e.EditValues: 用戶修改的值集合,Key 為欄位索引
// e.CommandArgument: 被編輯的行索引
int editedRow = Convert.ToInt32(e.CommandArgument);
var sheet = FpSpread1.Sheets[0];
// 示例:若第一列為 "auto",自動填充當前時間
if (sheet.Cells[editedRow, 0].Text == "auto")
{
foreach (var kv in e.EditValues)
{
int col = kv.Key;
string newVal = kv.Value?.ToString();
if (!string.IsNullOrEmpty(newVal))
{
sheet.Cells[editedRow, col].Text = newVal;
}
}
// 自動填充時間戳
sheet.Cells[editedRow, 4].Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}
// 保存回 Excel 或資料庫
FpSpread1.SaveExcel(Server.MapPath("~/Data/EditedData.xlsx"));
// 或同步到 DB: UpdateDatabase(sheet, editedRow);
}
FarPoint 需要大量客戶端 JS/CSS/Image 資源(`fp_client` 目錄),否則頁面顯示空白或功能失效。
<!-- Web.config -->
<appSettings>
<add key="fp_client" value="fp_client/" /> <!-- 相對於網站根目錄 -->
</appSettings>
部署步驟:
| 現象 | 原因 | 解決 |
|---|---|---|
| 頁面空白/控件不顯示 | fp_client 路徑錯誤或權限不足 | 檢查 Web.config `fp_client` key、IIS 權限、瀏覽器 F12 Network 404 |
| SaveExcel 返回 false | 目錄寫入權限 / 文件被佔用 / 路徑不存在 | 授權 IIS_IUSRS、確保目錄存在、避免併發寫同一文件 |
| 公式不計算 | AutoCalculation=false / 公式語法錯誤 | 設 true、公式用英文逗號分隔參數、引用相對地址 |
| 編輯後數據丟失 | 未在 UpdateCommand 回寫 Sheet / ViewState 丟失 | UpdateCommand 內同步 Sheet.Cells,啟用 ViewState |
| 大數據量卡死 | 逐儲存格寫入慢 | 使用 `DataSource` + `DataBind()` 綁定 DataTable,或批量設值 |
// 適用於純數據展示、無複雜公式/合併儲存格的場景
DataTable dt = GetReportData();
FpSpread1.DataSource = dt;
FpSpread1.DataBind(); // 自動生成列、填充數據
// 綁定後可微調
FpSpread1.Sheets[0].Columns["Price"].Format = "C2"; // 貨幣格式
FpSpread1.Sheets[0].Columns["Date"].Format = "yyyy-MM-dd";
FarPoint Spread 核心工作流:
OpenExcel → 配置 Sheet 屬性 → 服務端填充數據/公式 → 前台編輯 UpdateCommand 回寫 → SaveExcel / 同步 DB
關鍵成功因素:`fp_client` 正確部署、目錄權限、大數據用 `DataSource` 綁定、公式列鎖定保護。