生成自動化資料表
在我的程式設計部落格中,我經常會對比不同算法和概念的結果特征。通常我會把執行結果(像運作時間)載入到控制台或一個文本文檔然後再将他們複制到資料表格中分析。最近呢,我發現了實作這一系列操作的另外一種方法:我用了下Spire.XSL 庫來生成最後的電子表格 – 處理所有的表格和圖表哦!閱讀下面的内容你将會學到如何利用這個函數庫來完成各種不同的自動化任務。
Download C# project - 7.1 KB, zip
示例
我們的目标是建立一個标準檢查應用程式,我們要在這上面測試三種不同的算法。我們想根據元素數量得到運作時間。以下是要用到的一段簡單代碼:
abstract class PerfTestBase{
public double ElapsedTimeSec {get; protected set;}
public string Name {get; protected set;}
public abstract void run(int n);
}
class BubbleSortPerfTest : PerfTestBase
{
public BubbleSortPerfTest()
{
Name = "Bubble Sort";
}
public override void run(int n)
// real implementation here
ElapsedTimeSec = X;
class MergeSortPerfTest : PerfTestBase
public MergeSortPerfTest()
Name = "Merge Sort";
class QuickSortPerfTest : PerfTestBase
public QuickSortPerfTest()
Name = "Quick Sort";
算法有了,現在我們需要用不同的起始參數來運作他們。
List<PerfTestBase> perfTests = new List<PerfTestBase>
{
new BubbleSortPerfTest(),
new MergeSortPerfTest(),
new QuickSortPerfTest()
};
// N from 10 up to 200, step is 10
var res = runAllTests(perfTests, 10, 200, 10);
printResults(res);
方法runAllTests 通過設定N的值并調用.run(N) 方法進行簡單疊代。
不過我們感興趣的部分是printResults方法。我們要用什麼代碼來自動生成報表并得出重要的結果呢?
最簡單的解決方案
起初我們想的是将所有結果列印至控制台。我們甚至可以使用CSV樣式然後很容易地把它複制到電子表格。
N;Bubble Sort;Merge Sort;Quick Sort;
10;20,00;140,46;96,71;
20;80,00;365,48;251,64;
過一會,當我們繼續變換算法的代碼,複制結果的工作變得冗長乏味。肯定會有更好更快的方法的。如果我們生成的不是CSV檔案而是完全的Excel檔案呢?
在這就是引入Spire.XLS的絕妙時機了。
介紹Spire.XLS
Spire.XLS 是一個使Office辦公自動化操作更簡便的函數庫
簡單地說:添加Spire.XLS的引用到你的程式中你就可以實作建立,打開,更新,輸出計算結果,而這些操作并不需要你的作業系統中安裝微軟的Excel或Office。
這個函數庫完全相容Excel 97/2003, 2007 和2010。
添加引用後的Spire.XLS還可以添加保護,壓縮檔案,甚至可以轉換成其他格式的檔案。例如你可以将你的檔案輸出為PDF, 圖像或者 HTML檔案。
通過這種方法我們可以輕松實作重要的自動化程式。
在代碼中使用Spire.XSL
在我們的示例中,我們可能隻用到這個函數庫的1%的功能!盡管如此他還是為我們的報表生成節省了不少時間。
基本用法
添加引用:
using Spire.Xls;
using Spire.Xls.Charts;
四行代碼建立“Hello World”工作簿:
Workbook wb = new Workbook();
Worksheet sheet = wb.Worksheets[0];
sheet.Range["A1"].Text = "Hello,World!";
wb.SaveToFile("Sample.xls",
ExcelVersion.Version2007);
以上代碼讓我們對這個函數庫有了個初步認識。基本上我們就可以對工作表,單個工作簿和單獨的單元格進行便捷的操作了。
進階解決方案
讓我們回到我們最原始的問題上。我們的新的解決方案是保持控制台的輸出部分,另外輸出結果依舊要儲存到Excel檔案中。也就是說,我們要建立一個圖表。使用這種方法,可以節省很多時間 – 因為不用一遍又一遍地複制和再生成圖表……
下面是關于儲存資料的部分的代碼:
Worksheet sheet = workbook.Worksheets[0];
sheet.Name = "Perf Test";
sheet.Range["A1"].Text = "Elapsed Time for sorting...";
sheet.Range["A1"].Style.Font.IsBold = true;
// columns title:
sheet.Range["C3"].Text = "N";
sheet.Range["C3"].Style.Font.IsBold = true;
sheet.Range["C3"].Style.HorizontalAlignment = HorizontalAlignType.Center;
char col = 'D';
foreach (var n in res.Map.Keys)
sheet.Range[col+"3"].Text = n;
sheet.Range[col+"3"].Style.Font.IsBold = true;
sheet.Range[col+"3"].Style.HorizontalAlignment = HorizontalAlignType.Center;
col++;
// insert values into rows...
再下面是一些圖表生成的代碼:
Chart chart = sheet.Charts.Add();
//Set region of chart data
chart.DataRange = workbook.Worksheets[0].Range[range];
chart.SeriesDataFromRange = false;
//Set position of chart
chart.LeftColumn = 2;
chart.TopRow = 2;
chart.RightColumn = 12;
chart.BottomRow = 30;
//Chart title
chart.ChartTitle = "Sorting Time...";
chart.ChartTitleArea.IsBold = true;
chart.ChartTitleArea.Size = 12;
// ...
chart.Legend.Position = LegendPositionType.Bottom;
chart.ChartType = ExcelChartType.ScatterSmoothedLineMarkers;
就這麼簡單!!
我特别欣賞這樣可以單個地選中單元格或者選中整行。注意改變單元格的樣式是多麼簡單。
最終的Excel檔案 – 當然是自動生成的:
還有圖表
類似函數庫
如果你想使用開源代碼,
ClosedXML – 使用ClosedXML可以建立Excel 2007/2010 檔案而不用安裝Excel程式。
EPPlus - 使用這個庫可以讀取和編輯Excel 2007/2010檔案,但僅支援Open Office Xml格式 (xlsx)。
NPOI - 一個開源工程,可以幫助你讀取/編輯xls, doc, ppt檔案。
總結
在本篇文章中,我向大家展示了如何簡單地把程式中的結果自動生成為資料表展示。通過使用Spire.XLS,程式設計者們可以在系統無安裝Office的情況下建立并處理Excel檔案。這個函數庫十分強大但是使用卻很簡便。我們的任務 – 建立運作結果表 – 就可以利用幾行代碼自動生成了。