缺點:dll.版本容易加載錯誤。CAD加載插件時,沒有加載所有類庫。插件運行過程中用到某個類庫,會從CAD的安裝目錄找,找不到就報錯了。
c#中三方庫操作excel多種方式,對比如下:
綜合對比
特性 | NPOI | Aspose.Cells | COM Interop (Excel.Application) |
---|---|---|---|
授權與成本 | 免費開源 (Apache 2.0) | 商業授權 (約$3,000/開發者) | 免費 (需安裝Office) |
依賴項 | 純.NET庫 (無依賴) | 純.NET庫 (無依賴) | 需安裝Microsoft Office |
部署環境 | 任意環境 (服務器/客戶端) | 任意環境 (服務器/客戶端) | 僅客戶端 (需安裝Office) |
性能 | ???? (較快) | ???? (優化良好) | ? (非常慢) |
功能完整性 | ??? (基礎功能完善) | ????? (100%功能覆蓋) | ????? (原生支持) |
內存占用 | 50-100 MB | 100-200 MB | 300-500 MB+ |
穩定性 | ???? | ????? | ? (常崩潰) |
多線程支持 | ? 良好 | ? 優秀 | ? 極差 |
文檔支持 | GitHub Wiki | 專業技術文檔+支持 | MSDN文檔 |
學習曲線 | 中等 | 中等 | 復雜 |
版本兼容性 | 向后兼容好 | 版本升級需注意 | Office版本強依賴 |
詳細分析
1. NPOI (POI for .NET)
優點:
using (var fs = new FileStream("test.xlsx", FileMode.Create)) { IWorkbook workbook = new XSSFWorkbook(); // xlsx格式 ISheet sheet = workbook.CreateSheet("Sheet1"); // 添加數據 IRow row = sheet.CreateRow(0); row.CreateCell(0).SetCellValue("Hello"); row.CreateCell(1).SetCellValue("NPOI"); workbook.Write(fs); }
-
💰?零成本:完全免費,Apache 2.0許可
-
🚀?高性能:內存操作,處理速度快
-
???無依賴:不依賴Office,適合服務器端使用
-
📦?輕量級:NuGet包僅5-10MB
-
🔄?格式支持:完美支持xls/xlsx格式
缺點:
-
???高級功能有限:
-
數據透視表支持不完善
-
復雜圖表功能較弱
-
條件格式實現復雜
-
-
📚?文檔不足:官方文檔較簡略,依賴社區示例
-
🧩?API設計:部分接口不夠直觀
適用場景:?報表導出、數據導入導出、簡單格式操作等基礎需求
2. Aspose.Cells
優點:
-
🧩?功能全面:
-
100% Excel功能覆蓋
-
完美支持數據透視表、高級圖表
-
公式計算引擎
-
格式轉換(PDF/HTML/CSV等)
-
-
?
-
3. COM Interop (Excel.Application)
優點:
🛡??穩定可靠:商業級質量保證
-
📊?高性能處理:優化的大數據量處理
-
🔄?版本兼容:支持從Excel 97到最新格式
-
🔌?原生支持:100% Excel功能兼容
-
🧩?VBA移植:可直接轉換VBA代碼
-
🎨?所見即所得:實時可視化操作
最終建議
-
優先選擇NPOI?- 對于大多數場景足夠且免費
-
投資Aspose當:
-
需要處理復雜Excel功能
-
要求高穩定性
-
預算允許($3,000+/開發者)
-
-
完全避免COM互操作?- 除非在受控客戶端環境且無替代方案
您遇到的"Evaluation Only"問題正是Aspose商業授權的典型表現。若預算有限,遷移到NPOI是明智選擇,盡管可能需要調整部分高級功能實現方式。
public void Npoi(){try{// 步驟1:創建 XSSF 工作簿(對應 .xlsx 格式)using (IWorkbook workbook = new XSSFWorkbook()){// 步驟2:刪除默認創建的所有工作表(新建工作簿默認有一個 "Sheet1")while (workbook.NumberOfSheets > 0){workbook.RemoveSheetAt(0); // 按索引刪除工作表(從0開始)}// 步驟3:創建名為 "乘法表" 的新工作表ISheet sheet = workbook.CreateSheet("乘法表");// 步驟4:設置表頭(第一行第一列,合并單元格 A1-I1)IRow headerRow = sheet.CreateRow(0); // 行索引從0開始(第一行)ICell headerCell = headerRow.CreateCell(0); // 列索引從0開始(第一列)headerCell.SetCellValue("九九乘法表");// 合并單元格(行范圍:0-0,列范圍:0-8,對應 A1 到 I1)CellRangeAddress headerMergeRegion = new CellRangeAddress(0, 0, 0, 8);sheet.AddMergedRegion(headerMergeRegion);// 步驟5:生成九九乘法表內容(從第二行開始,行索引1)for (int i = 1; i <= 9; i++) // 外層循環:被乘數(1-9){IRow dataRow = sheet.CreateRow(i); // 創建第 i+1 行(行索引i)for (int j = 1; j <= i; j++) // 內層循環:乘數(1到被乘數){ICell cell = dataRow.CreateCell(j - 1); // 列索引 = j-1(從0開始)cell.SetCellValue($"{j}*{i}={i * j}"); // 格式示例:"2*3=6"}}// 步驟6:設置列寬(可選,根據內容自適應寬度)for (int col = 0; col < 9; col++){sheet.AutoSizeColumn(col); // 自動調整列寬以適應內容}// 調用格式設置函數(核心封裝功能)SetSheetFormat(sheet);// 步驟7:獲取桌面路徑并保存文件string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);string savePath = Path.Combine(desktopPath, "九九乘法表.xlsx");using (FileStream fs = new FileStream(savePath, FileMode.Create, FileAccess.Write)){workbook.Write(fs); // 將工作簿寫入文件流}Z.ed.WriteMessage($"Excel 文件已成功保存到:{savePath}");}}catch (Exception ex){Z.ed.WriteMessage($"操作失敗,錯誤信息:{ex.Message}");}}/// <summary>/// 封裝:設置工作表格式(字體加粗、邊框、對齊、自動列寬)/// </summary>/// <param name="sheet">需要設置格式的工作表</param>static void SetSheetFormat(ISheet sheet){IWorkbook workbook = sheet.Workbook; // 獲取工作簿引用(用于創建樣式)#region 樣式定義// 表頭字體樣式(加粗)IFont headerFont = workbook.CreateFont();headerFont.FontHeightInPoints = 12; // 字體大小headerFont.Boldweight = (short)FontBoldWeight.Bold; // 加粗// 內容單元格樣式(邊框+居中對齊)ICellStyle contentStyle = workbook.CreateCellStyle();contentStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center; // 水平居中contentStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center; // 垂直居中// 設置黑色細邊框(上下左右)contentStyle.BorderTop = BorderStyle.Thin;contentStyle.BorderBottom = BorderStyle.Thin;contentStyle.BorderLeft = BorderStyle.Thin;contentStyle.BorderRight = BorderStyle.Thin;contentStyle.TopBorderColor = IndexedColors.Black.Index;contentStyle.BottomBorderColor = IndexedColors.Black.Index;contentStyle.LeftBorderColor = IndexedColors.Black.Index;contentStyle.RightBorderColor = IndexedColors.Black.Index;// 表頭單元格樣式(合并后單獨設置)ICellStyle headerStyle = workbook.CreateCellStyle();headerStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;headerStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;headerStyle.SetFont(headerFont); // 應用加粗字體#endregion#region 處理表頭格式// 表頭行(第0行)IRow headerRow = sheet.GetRow(0);if (headerRow != null){// 合并后的表頭單元格(A1)ICell headerCell = headerRow.GetCell(0);if (headerCell != null){headerCell.CellStyle = headerStyle; // 應用表頭樣式}}#endregion#region 獲取表格最大行和列int maxRow = sheet.LastRowNum; // 最后一行索引(從0開始)int maxCol = 0;// 遍歷所有行獲取最大列數for (int rowNum = 0; rowNum <= maxRow; rowNum++){IRow row = sheet.GetRow(rowNum);if (row != null && row.LastCellNum > maxCol){maxCol = row.LastCellNum; // 記錄當前行的最大列數}}#endregion#region 應用內容格式(所有單元格)for (int rowNum = 0; rowNum <= maxRow; rowNum++){IRow row = sheet.GetRow(rowNum) ?? sheet.CreateRow(rowNum); // 確保行存在for (int colNum = 0; colNum < maxCol; colNum++){ICell cell = row.GetCell(colNum) ?? row.CreateCell(colNum); // 確保單元格存在cell.CellStyle = contentStyle; // 應用內容樣式(邊框+對齊)}}#endregion#region 自動調整列寬for (int colNum = 0; colNum < maxCol; colNum++){sheet.AutoSizeColumn(colNum); // 自動調整列寬// 適當增加列寬(避免內容過緊)sheet.SetColumnWidth(colNum, sheet.GetColumnWidth(colNum) + 1000);}#endregion}/// <summary>/// 生成九九乘法表數據到指定工作表/// </summary>/// <param name="sheet">目標工作表</param>
唯一文件名:? ? ? ? ??
? ? ? ? ? ? ? ?
?string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);string dateTimeStr = DateTime.Now.ToString("yyyyMMdd_HHmmss");string savePath = Path.Combine(desktopPath, $"九九乘法表_{dateTimeStr}.xlsx");
?
?