我在这里导出3个表格到Excel,我只想转置其中的第一个表格。我试着使用转置函数,但似乎用错了方法,因为它抛出了System.ArgumentException。不确定,另一种方法是什么来转置表格。
我也尝试过使用DataView,但即使这样也不起作用。下面是我对DataView做的事情:
static void Main(string[] args)
{
string strSql = ConfigurationManager.AppSettings["Sql"];
DataAccess dsObj = new DataAccess();
DataSet ds= dsObj.GetData(strSql);
DataView transposedDataView = Transpose(ds.Tables[0].Copy()).DefaultView;
var td = transposedDataView.ToTable();
TableData(td, ds.Tables[1], ds.Tables[2]);
}下面是完整的代码
class CreateWorkbook
{
static void Main(string[] args)
{
string strSql = ConfigurationManager.AppSettings["Sql"];
DataAccess dsObj = new DataAccess();
DataSet ds= dsObj.GetData(strSql);
TableData(Transpose(ds.Tables[0]), ds.Tables[1], ds.Tables[2]);
}
private static DataTable Transpose(DataTable dt)
{
DataTable dtNew = new DataTable();
//adding columns
for (int i = 0; i <= dt.Rows.Count; i++)
{
dtNew.Columns.Add(i.ToString());
}
//Changing Column Captions:
dtNew.Columns[0].ColumnName = " ";
//Adding Row Data
for (int k = 1; k < dt.Columns.Count; k++)
{
DataRow r = dtNew.NewRow();
r[0] = dt.Columns[k].ToString();
for (int j = 1; j <= dt.Rows.Count; j++)
r[j] = dt.Rows[j - 1][k];
dtNew.Rows.Add(r);
}
return dtNew;
}
private static void TableData(DataTable Summary, DataTable NewIssue, DataTable Backlog) // Datatable contains data which we want to show in excel report
{
// create a new excel package for writing
using (ExcelPackage workingPkg = new ExcelPackage())
{
//create workbook
ExcelWorkbook wbReport = workingPkg.Workbook;
//Add worksheets in workbook
ExcelWorksheet ws = workingPkg.Workbook.Worksheets.Add("Summary.xlsx");
ExcelWorksheet ws1 = workingPkg.Workbook.Worksheets.Add("NewIssuance.xlsx");
ExcelWorksheet ws2 = workingPkg.Workbook.Worksheets.Add("BuyBack.xlsx");
ws.Cells["A1"].LoadFromDataTable(Summary, true, TableStyles.Medium1);
ws.Cells[ws.Dimension.Address].AutoFitColumns();
ws.Cells["A:H"].Style.Numberformat.Format = "#,##0";
ws1.Cells["A1"].LoadFromDataTable(NewIssuance, true, TableStyles.Medium1);
ws1.Cells[ws1.Dimension.Address].AutoFitColumns();
ws1.Cells["A:H"].Style.Numberformat.Format = "#,##0";
ws2.Cells["A1"].LoadFromDataTable(BuyBack, true, TableStyles.Medium1);
ws2.Cells[ws2.Dimension.Address].AutoFitColumns();
ws2.Cells["A:H"].Style.Numberformat.Format = "#,##0";
workingPkg.SaveAs(new FileInfo(ConfigurationManager.AppSettings["Location"] + DateTime.Now.ToString("_MM_yyyy")+".xlsx"));
}
}
}发布于 2017-12-19 07:00:32
尝试将数据转置到excel中,而不是转置数据表并让ExcelPackage读取转置后的表;数据表从来都不是这样使用的。DataTables绝对完全是一个数据集合,其列的类型是一致的。您不能将包含一个int列和一个string列的两行表转换为一对无类型列,分别表示一个int行和一个字符串行。不能让DataTable像那样工作
我从来没有使用过ExcelPackage,所以我不保证下面的代码是100%没有错误的(例如,我不确定ExcelPackage使用的是基于0的索引还是基于1的索引等);其思想是展示您可以逐行、逐列地迭代数据表,但是您可以逐列、逐行地将数据写入excel工作表,从而有效地对其进行转置
for(int tr=0;tr<table.Length;tr++)
for(int tc=0;tc<table.Length;tc++)
worksheet.Cells(tc,tr).Value = table.Rows[tr][tc];https://stackoverflow.com/questions/47877246
复制相似问题