首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Datatable不能被转置。"System.ArgumentException‘

Datatable不能被转置。"System.ArgumentException‘
EN

Stack Overflow用户
提问于 2017-12-19 06:19:55
回答 1查看 180关注 0票数 1

我在这里导出3个表格到Excel,我只想转置其中的第一个表格。我试着使用转置函数,但似乎用错了方法,因为它抛出了System.ArgumentException。不确定,另一种方法是什么来转置表格。

我也尝试过使用DataView,但即使这样也不起作用。下面是我对DataView做的事情:

代码语言:javascript
复制
 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]);
    }

下面是完整的代码

代码语言:javascript
复制
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"));
            }
        }
    }
EN

回答 1

Stack Overflow用户

发布于 2017-12-19 07:00:32

尝试将数据转置到excel中,而不是转置数据表并让ExcelPackage读取转置后的表;数据表从来都不是这样使用的。DataTables绝对完全是一个数据集合,其列的类型是一致的。您不能将包含一个int列和一个string列的两行表转换为一对无类型列,分别表示一个int行和一个字符串行。不能让DataTable像那样工作

我从来没有使用过ExcelPackage,所以我不保证下面的代码是100%没有错误的(例如,我不确定ExcelPackage使用的是基于0的索引还是基于1的索引等);其思想是展示您可以逐行、逐列地迭代数据表,但是您可以逐列、逐行地将数据写入excel工作表,从而有效地对其进行转置

代码语言:javascript
复制
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];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47877246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档