注意:我爲OfficeWriter的製造商SoftArtisans工作。
如果您的數據具有唯一值,並且您只需轉置數據,那麼有幾個選項。
例如,如果你的數據是這樣的:
Date Name Address Age
05/01/2013 Bob 70 Random Dr 54
05/02/2013 Carl 50 Unique Rd 76
05/03/2013 Fred 432 Tiger Lane 56
05/04/2013 Amy 123 Think Ave 23
05/05/2013 Dana 58 Turtle Path 67
而且你要導入的數據,以便它看起來像這樣:
Date 05/01/2013 05/02/2013 05/03/2013 05/04/2013 05/05/2013
Name Bob Carl Fred Amy Dana
Address 70 Random Dr 50 Unique Rd 432 Tiger Lane 123 Think Ave 58 Turtle Path
Age 54 76 56 23 67
最容易的選擇 - 進口與ExcelApplication
最簡單的選擇是使用ExcelApplication對象的Worksheet.ImportData方法以編程方式導入數據。要自定義數據的導入方式,您需要設置一些DataImportProperties。
//Open or create a file with ExcelApplication
ExcelApplication xla = new ExcelApplication();
Workbook wb = xla.Create(ExcelApplication.FileFormat.Xlsx);
//Get a handle on the worksheet where you want to import the data
//You can also create a new worksheet instead
Worksheet ws = wb.Worksheets.CreateWorksheet("ImportedData");
//Create a DataImportProperties object
//Set the data import to transpose the data
DataImportProperties dataImportProps = wb.CreateDataImportProperties();
dataImportProps.Transpose = true;
//Import the data
DataTable dt = GetData(); //random method that returns some data
ws.ImportData(dt, ws.Cells["A1"], dataImportProps);
//Stream the output back to the client
xla.Save(wb, Page.Response, "Output.xlsx", false);
IMPORTDATA不會自動導入數據集的頭名。因此,您可能還希望將DataImportProperties.UseColumnNames設置爲TRUE以導入標題名稱(日期,名稱,地址,年齡)。
如果要導入數字數據,如年齡或日期,您可能還需要設置DataImportProperties.ConvertStrings到TRUE以確保它們導入爲數字而不是文本。
的另一種方法 - 導入與ExcelTemplate
的另一種方法是使用ExcelTemplate對象將數據導入到包含佔位符data markers指示應將數據導入現有的模板文件。
ExcelTemplate也有DataBindingProperties,它們在調用ExcelTemplate.BindData時控制數據的導入方式。其中一個屬性DataBindingProperties.Transpose將轉交數據。如果數據源是二維數組,則此屬性只會生效。
//Open a template with placeholder data markers
ExcelTemplate xlt = new ExcelTemplate();
xlt.Open("template.xlsx");
//Create DataBindingProperties and set it to transpose the data
DataBindingProperties dataBindProps = xlt.CreateDataBindingProperties();
dataBindProps.Transpose = true;
//Bind data to the template
//data is of type object[][]
//colNames is of type string[] e.g {"Date", "Name", "Address", "Age"}
xlt.BindData(data, colNames, "DataSource", dataBindProps);
//Process and save the template
xlt.Process();
xlt.Save(Page.Response, "Output.xlsx", false);
默認情況下,ExcelTemplate不會導入列名。要轉置並導入列名稱,您需要一個s eparate data marker in the template(即%% = $ HeaderNames),並分別致電ExcelTemplate.BindColumnData將標題名稱導入列中。
//headerNames is of type object[]
//dataBindProps2 is a second DataBindingProperties that is not set to transpose
xlt.BindColumnData(headerNames, "HeaderNames", dataBindProps2);
重要的是要注意ImportData不會對數據進行分組/排序。如果您的數據有重複的記錄(即具有相同日期的多個記錄),它將無法合併相關日期的所有數據。要做到這一點,您可能需要使用ExcelTemplate對象導入數據,然後使用數據透視表對日期進行轉置和分組:http://wiki.softartisans.com/display/EW8/Templates+and+PivotTables。 – AlisonB