在使用 C# 透過 Excel COM 物件模型開發報表時,常會遇到長數字(如身分證號、帳號)被 Excel 自動轉為科學計數法顯示(例如 1.2345E+17)的問題。這是因為 Excel 預設將超過 15 位數的數字視為科學計數法。要解決此問題,必須在寫入資料前,將目標儲存格的格式設定為文字或自訂格式。
透過 Range.NumberFormatLocal 屬性指定格式字串 \"@\"(文字格式)或 \"#\"(自訂數字格式,不顯示千分位符號),即可強制 Excel 以原始樣貌顯示長數字。
using Excel = Microsoft.Office.Interop.Excel;
using System.Reflection;
using System.Runtime.InteropServices;
public void FormatLongNumber()
{
Excel.Application excelApp = null;
Excel.Workbook workbook = null;
Excel.Worksheet worksheet = null;
Excel.Range range = null;
object missing = Missing.Value;
try
{
excelApp = new Excel.Application();
workbook = excelApp.Workbooks.Open(@"E:\1.xls", missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
worksheet = (Excel.Worksheet)workbook.Worksheets[1];
range = worksheet.get_Range("A1", missing);
// 關鍵:設定儲存格格式為文字或自訂格式
range.NumberFormatLocal = "@"; // 或使用 "#"
workbook.SaveAs(@"E:\22.xls", missing, missing, missing, missing, missing, Excel.XlSaveAsAccessMode.xlNoChange, missing, missing, missing, missing, missing);
}
catch (Exception ex)
{
MessageBox.Show($"發生錯誤:{ex.Message}");
}
finally
{
// 正確釋放 COM 物件,避免 Excel 進程殘留
if (workbook != null) { workbook.Close(false, missing, missing); Marshal.ReleaseComObject(workbook); }
if (excelApp != null) { excelApp.Quit(); Marshal.ReleaseComObject(excelApp); }
workbook = null; excelApp = null; worksheet = null; range = null;
GC.Collect(); GC.WaitForPendingFinalizers();
}
}
\"@\" 將儲存格視為純文字,適合身分證、條碼等不需運算的長數字;\"#\" 則保留數字屬性但不科學計數法顯示。finally 區塊中依序釋放 Range、Worksheet、Workbook、Application 等 COM 物件,並呼叫 GC.Collect() 確保進程結束。掌握此技巧,即可在 C# Excel 報表開發中完美呈現長數字資料,避免使用者困擾。