在以前接觸的項目中,由於很多客戶對微軟Excel的操作比較熟練,客戶經常要求系統支持對Excel文件的讀寫。用.NET傳統方法對Excel進行讀寫時,往往會涉及到不同版本兼容的問題,導致在本地測試一切正常,但是到客戶那經常會出現各種問題。后來發現一個Spire.XLS的NET庫,可以很方便的對不同版本的Excel文件進度操作,還可以生成各種常見的圖形。下面結合一個簡單的例子,看一下效果:
1、首先要安裝Spire.XLS,可以自定百度,然后建立一個windows應用程序WinExcelDemo,注意添加相關dll引用:
2、編寫代碼,這里當主界面打開時,就開始進行Excel的數據准備和文件生產操作,代碼如下:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Windows.Forms; 10 11 namespace WinExcelDemo 12 { 13 using Spire.Xls; 14 using Spire.Xls.Charts; 15 public partial class Form1 : Form 16 { 17 public Form1() 18 { 19 InitializeComponent(); 20 } 21 22 private void Form1_Load(object sender, EventArgs e) 23 { 24 Run(); 25 } 26 private void Run() 27 { 28 Workbook workbook = new Workbook(); 29 30 //初始化 工作簿worksheet 31 workbook.CreateEmptySheets(1); 32 Worksheet sheet = workbook.Worksheets[0]; 33 sheet.Name = "數據"; 34 sheet.GridLinesVisible = false; 35 36 //創建圖形數據 37 CreateChartData(sheet); 38 //在工作簿中添加一個新的圖表 39 Chart chart = sheet.Charts.Add(); 40 41 //設置數據的區域 42 chart.DataRange = sheet.Range["A1:C5"]; 43 chart.SeriesDataFromRange = false; 44 45 //設置圖的位置 46 chart.LeftColumn = 1; 47 chart.TopRow = 6; 48 chart.RightColumn = 11; 49 chart.BottomRow = 29; 50 //圖類型 51 chart.ChartType = ExcelChartType.Area; 52 //圖標題 53 chart.ChartTitle = "Sales market by country"; 54 chart.ChartTitleArea.IsBold = true; 55 chart.ChartTitleArea.Size = 12; 56 57 chart.PrimaryCategoryAxis.Title = "Country"; 58 chart.PrimaryCategoryAxis.Font.IsBold = true; 59 chart.PrimaryCategoryAxis.TitleArea.IsBold = true; 60 61 chart.PrimaryValueAxis.Title = "Sales(in Dollars)"; 62 chart.PrimaryValueAxis.HasMajorGridLines = false; 63 chart.PrimaryValueAxis.TitleArea.TextRotationAngle = 90; 64 chart.PrimaryValueAxis.MinValue = 1000; 65 chart.PrimaryValueAxis.TitleArea.IsBold = true; 66 67 68 foreach (Spire.Xls.Charts.ChartSerie cs in chart.Series) 69 { 70 //不同顏色 71 cs.Format.Options.IsVaryColor = true; 72 //顯示數據標簽 73 cs.DataPoints.DefaultDataPoint.DataLabels.HasValue = true; 74 } 75 //Legend位置 76 chart.Legend.Position = LegendPositionType.Top; 77 workbook.SaveToFile("Sample.xls"); 78 ExcelDocViewer(workbook.FileName); 79 } 80 81 private void CreateChartData(Worksheet sheet) 82 { 83 //Country 84 sheet.Range["A1"].Value = "Country"; 85 sheet.Range["A2"].Value = "Cuba"; 86 sheet.Range["A3"].Value = "Mexico"; 87 sheet.Range["A4"].Value = "France"; 88 sheet.Range["A5"].Value = "German"; 89 90 //Jun 91 sheet.Range["B1"].Value = "Jun"; 92 sheet.Range["B2"].NumberValue = 6000; 93 sheet.Range["B3"].NumberValue = 8000; 94 sheet.Range["B4"].NumberValue = 9000; 95 sheet.Range["B5"].NumberValue = 8500; 96 97 //Jun 98 sheet.Range["C1"].Value = "Aug"; 99 sheet.Range["C2"].NumberValue = 3000; 100 sheet.Range["C3"].NumberValue = 2000; 101 sheet.Range["C4"].NumberValue = 2300; 102 sheet.Range["C5"].NumberValue = 4200; 103 104 //Style 105 sheet.Range["A1:C1"].Style.Font.IsBold = true; 106 sheet.Range["A2:C2"].Style.KnownColor = ExcelColors.LightYellow; 107 sheet.Range["A3:C3"].Style.KnownColor = ExcelColors.LightGreen1; 108 sheet.Range["A4:C4"].Style.KnownColor = ExcelColors.LightOrange; 109 sheet.Range["A5:C5"].Style.KnownColor = ExcelColors.LightTurquoise; 110 111 //Border 112 sheet.Range["A1:C5"].Style.Borders[BordersLineType.EdgeTop].Color = Color.FromArgb(0, 0, 128); 113 sheet.Range["A1:C5"].Style.Borders[BordersLineType.EdgeTop].LineStyle = LineStyleType.Thin; 114 sheet.Range["A1:C5"].Style.Borders[BordersLineType.EdgeBottom].Color = Color.FromArgb(0, 0, 128); 115 sheet.Range["A1:C5"].Style.Borders[BordersLineType.EdgeBottom].LineStyle = LineStyleType.Thin; 116 sheet.Range["A1:C5"].Style.Borders[BordersLineType.EdgeLeft].Color = Color.FromArgb(0, 0, 128); 117 sheet.Range["A1:C5"].Style.Borders[BordersLineType.EdgeLeft].LineStyle = LineStyleType.Thin; 118 sheet.Range["A1:C5"].Style.Borders[BordersLineType.EdgeRight].Color = Color.FromArgb(0, 0, 128); 119 sheet.Range["A1:C5"].Style.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.Thin; 120 121 sheet.Range["B2:C5"].Style.NumberFormat = "\"$\"#,##0"; 122 } 123 124 private void ExcelDocViewer(string fileName) 125 { 126 try 127 { 128 //打開生成的Excel 129 System.Diagnostics.Process.Start(fileName); 130 } 131 catch { } 132 } 133 } 134 }
3、運行代碼,可以看到如下結果:
4、總結
上面只是該庫很小一部分功能,該庫還能對Excel進行分組、支持VBA擴展等功能,該庫雖然強大,但是不開源,是商業軟件。不過經過了解,Spire.XLS也提供免費版,只不過免費版有一個Excel文檔不能超過5個sheet的限制。對於一些小項目,免費版也完全夠用可以考慮。至於較大應用,則需要商業版。NOPI是開源的Excel庫,也可以方便的進行Excel讀寫操作且無需安裝office,但功能不及Spire.XLS全面。開源和非開源,存在即合理,各有優勢。