0

我正在尝试使用 Softartisans ExcelWriter(Office Writer 的一部分)填充 Excel 电子表格,如果您只需要“加载”一条记录或表格,这很容易。

我需要填写一个“交叉表”,如下所示:

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

name

address

age

etc

etc

etc 

所有数据(日期、姓名、地址……)都在同一条记录上,如上所示,我需要使用日期字段作为列标题。

我们可以看到它不是水平列出数据,而是需要垂直列出。所有数据都来自一个表,以前有人做到过吗?

我可以填充第一列,但是在阅读了一个多星期的文档并开始谷歌寻求正确的回应之后,我真的很绝望。

如果这在 ExcelWriter 中是不可能的,请您推荐我如何从网络生成交叉表报告,它可以是 xls 或 pdf 格式。对于中级程序员来说很容易。

4

1 回答 1

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.ConvertStrings设置为TRUE以确保将它们作为数字而不是文本导入。

替代方法 - 使用 ExcelTemplate 导入

另一种方法是使用ExcelTemplate对象将数据导入现有模板文件,该文件包含占位符数据标记以指示应将数据导入到何处。

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 不导入列名。要转置和导入列名,您需要在模板中作为单独的数据标记(即 %%=$HeaderNames)并单独调用ExcelTemplate.BindColumnData以将标题名称导入列。

//headerNames is of type object[]
//dataBindProps2 is a second DataBindingProperties that is not set to transpose
xlt.BindColumnData(headerNames, "HeaderNames", dataBindProps2);
于 2013-06-27T12:44:04.773 回答