2013-05-28 77 views
0

我試圖使用Softartisans ExcelWriter(Office Writer的一部分)填充Excel電子表格,如果您需要「加載」只有一個記錄或表格表格,這很容易。填充excel交叉表

我需要來一補「交叉表」,像這樣:

 01-may-2013  02-may-2013  03-may-2013 etc... 

name 

address 

age 

etc 

etc 

etc 

所有數據(日期,姓名,地址,...)都在相同的記錄,如上面看到的,我需要將日期字段用作列標題。

我們可以看到它不是水平列出數據,而是需要垂直進行。所有數據來自單個表格,任何人都可以實現此目的?

我可以填充第一列,但在閱讀文檔超過一個星期後,開始Google正確的響應,我真的很絕望。

如果這在ExcelWriter中是不可能的,你能否推薦我如何從網上生成一個交叉表報告,它可以是xls或pdf。對於中級程序員來說也很簡單。

回答

1

注意:我爲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.ConvertStringsTRUE以確保它們導入爲數字而不是文本。

的另一種方法 - 導入與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); 
+0

重要的是要注意ImportData不會對數據進行分組/排序。如果您的數據有重複的記錄(即具有相同日期的多個記錄),它將無法合併相關日期的所有數據。要做到這一點,您可能需要使用ExcelTemplate對象導入數據,然後使用數據透視表對日期進行轉置和分組:http://wiki.softartisans.com/display/EW8/Templates+and+PivotTables。 – AlisonB