將一個 Excel 工作表中的多個帶格式區域,分別另存為獨立 Excel 檔案,要求完整保留來源格式(字型、顏色、邊框、數值格式等),但不複製公式、參考、資料驗證等邏輯屬性。
PasteSpecial 無法同時達成「僅值」與「僅格式」關鍵洞見:分兩次貼上——第一次貼上數值,第二次貼上格式。
// 核心貼上邏輯
ws.get_Range(beginCell, pasteRange).PasteSpecial(
XlPasteType.xlPasteValues,
XlPasteSpecialOperation.xlPasteSpecialOperationNone,
Type.Missing, Type.Missing);
ws.get_Range(beginCell, pasteRange).PasteSpecial(
XlPasteType.xlPasteFormats,
XlPasteSpecialOperation.xlPasteSpecialOperationNone,
Type.Missing, Type.Missing);
測試證實:單用 xlPasteAll 會複製公式與參考;單用 xlPasteValues 僅有數值無格式;單用 xlPasteFormats 僅有格式無數值。疊加兩次完美達標。
var wb = app.Workbooks.Add(Type.Missing);
var ws = (Worksheet)wb.Worksheets[1];
// 貼上數值與格式(同上)
ws.get_Range(beginCell, pasteRange).Columns.AutoFit(); // 自動欄寬
wb.SaveCopyAs(fileName); // 關鍵:不彈窗、自動覆蓋、不變更原工作簿狀態
wb.Close(false, Type.Missing, Type.Missing); // 不儲存變更關閉
SaveCopyAs 優於 SaveAs:不修改工作簿 Saved 狀態、不觸發事件、不彈出對話框、直接覆蓋既有檔案。
public void ExportRegions() {
Clipboard.Clear();
Application.ScreenUpdating = false;
// 建立隱藏 Excel 進程
var app = new Application { Visible = false };
try {
for (int i = 1; i < 14; i++) {
// 1. 取得來源區域與目標檔名
Sheet10.Range["O1"].Value2 = i;
string fileName = ThisWorkbook.Path + Utility.CreateFileName(
Sheet1.Range["B5"].Value2.ToString(),
Sheet3.Range["B2"].Value2.ToString(),
Sheet1.Range["C5"].Value2.ToString());
string pasteRange = Utility.SelectAndCopyRange("B", 5, 9, "N", 22);
// 2. 複製來源區域
Globals.Sheet1.Range[pasteRange].Copy(Type.Missing);
// 3. 建立新活頁簿、貼上、另存
Utility.CreateAndPaste(app, pasteRange, "B5", fileName);
}
MessageBox.Show("Success!");
}
finally {
Application.ScreenUpdating = true;
app.Quit();
Clipboard.Clear();
}
}
public static string SelectAndCopyRange(string startCol, int startRow, int endRow, string endCol, int endRow2) {
// 邏輯組合範圍字串,如 "B5:N22"
string range = $"{startCol}{startRow}:{endCol}{endRow2}";
Globals.Sheet1.Range[range].Copy(Type.Missing);
return range;
}
public static void CreateAndPaste(Application app, string pasteRange, string beginCell, string fileName) {
var wb = app.Workbooks.Add(Type.Missing);
var ws = (Worksheet)wb.Worksheets[1];
ws.get_Range(beginCell, pasteRange).PasteSpecial(
XlPasteType.xlPasteValues, XlPasteSpecialOperation.xlPasteSpecialOperationNone,
Type.Missing, Type.Missing);
ws.get_Range(beginCell, pasteRange).PasteSpecial(
XlPasteType.xlPasteFormats, XlPasteSpecialOperation.xlPasteSpecialOperationNone,
Type.Missing, Type.Missing);
ws.get_Range(beginCell, pasteRange).Columns.AutoFit();
wb.SaveCopyAs(fileName);
wb.Close(false, Type.Missing, Type.Missing);
Clipboard.Clear();
}
Clipboard.Clear(),避免殘留資料干擾ScreenUpdating = false 大幅提升批次處理速度Visible = false 避免閃爍與使用者干擾finally 區塊確保 app.Quit(),防止殭屍進程Marshal.ReleaseComObject 徹底釋放VSTO 操作 Excel 物件模型時,雙重 PasteSpecial(Values + Formats) 解決「保留格式不帶邏輯」的核心需求,SaveCopyAs 實現無人值守另存。配合隱藏 Excel 進程、關閉螢幕更新、剪貼簿管理,構建穩健高效的 Excel 自動化方案。