【问题标题】:Trying to create a datatable but I can't seem to make the rows as I want试图创建一个数据表,但我似乎无法按照我的意愿制作行
【发布时间】:2021-04-07 16:45:54
【问题描述】:

为了便于理解,我将显示 excel 输出

Excel output

代码也很简单,如何让行正确?我尝试创建多个数据表并合并它们,但合并始终是垂直的,所以我得到了相同的输出。


      dt.Columns.Add("Nomes", typeof(string));

      DataRow dr;

      for (int i = 0; i < surveyAnswers.Respostas.Count; i++) {


        if (i == 0) {

          dr = dt.NewRow();

          dr[0] = surveyAnswers.Respostas[i].quemRespondeu;
          dt.Rows.Add(dr);
        }

        if (i > 0) {
          string nome = surveyAnswers.Respostas[i].quemRespondeu;


          if (nome != surveyAnswers.Respostas[i - 1].quemRespondeu) {
            dt.Rows.Add(nome);
          }
        }
      }

      

      for (int j = 0; j < surveyGroups.Count; j++) {

        string grupo = surveyGroups[j].SubTitulo;
        dt.Columns.Add(grupo, typeof(string));

        for (int i = 0; i < surveyAnswers.Respostas.Count; i++) {

          if (surveyAnswers.Respostas[i].QuestaoGrupo == j) {


            dr = dt.NewRow();
            dr[j] = surveyAnswers.Respostas[i].QuestaoPergunta;
            dt.Rows.Add(dr);


          }


        }

      }


      Dictionary<string, string> header = new Dictionary<string, string>();
      header.Add("Content-Disposition", "attachment;filename=questionario_resultados.csv");
      ResponseUtil.Write(context, DataTableToCSV.WriteToString(dt, true, false), "text/csv; charset=UTF-8", header); ```

【问题讨论】:

    标签: c# excel visual-studio datatables


    【解决方案1】:

    每次在第二个 for 循环中添加新列时,您都在创建新行,而您已经在第一个循环中创建了行。您应该修改现有行,而不是创建新行。

    而不是这个:

     dr = dt.NewRow();
     dr[j] = surveyAnswers.Respostas[i].QuestaoPergunta;
     dt.Rows.Add(dr);
    

    试试这样的:

    dr[i][grupo] = surveyAnswers.Respostas[i].QuestaoPergunta;
    

    我没有测试它。

    【讨论】:

    • 哇,你们太棒了,我会试试你们的想法!
    【解决方案2】:

    由于不知道怎么获取excel文件,所以我对excel进行了修改使其正常。

    我创建了一个 winform 应用程序并使用 datagridview 来显示数据表。

    private void button1_Click(object sender, EventArgs e)
        {
            Excel.Application excelApp = new Excel.Application();
            Excel.Workbook workbook = excelApp.Workbooks.Open("E:\\test.xlsx", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
            Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[1];
            Excel.Range usedRange = worksheet.UsedRange;
            int usedrow = usedRange.Rows.Count;
            int usedcolumn = usedRange.Columns.Count;
    
            for (int i = 2; i <= usedcolumn; i++)
            {
                int row = worksheet.UsedRange.Columns[i, Type.Missing].Rows.Count;
                int firstrow = Firstusedrow(usedrow, i, worksheet);
                Excel.Range copyRange = worksheet.Range[worksheet.Cells[firstrow, i], worksheet.Cells[row, i]];
                Excel.Range insertRange = worksheet.Range[worksheet.Cells[2, i], worksheet.Cells[row, i]];
                insertRange.Insert(Excel.XlInsertShiftDirection.xlShiftDown, copyRange.Cut());
            }
           
           
            workbook.Save();
            workbook.Close();
            dataGridView1.DataSource = null;
            DataTable table = READExcel("E:\\test.xlsx");
            dataGridView1.DataSource = table;
            MessageBox.Show("success");
        }
        public int Firstusedrow(int row,int column, Excel.Worksheet sheet)
        {
            for (int i = 2; i < row; i++)
            {
                if ((sheet.Cells[i, column] as Excel.Range).Value2 != null)
                {
                    return i;
                }
            }
            return 0;
        }
        public DataTable READExcel(string path)
        {
            Microsoft.Office.Interop.Excel.Application objXL = null;
            Microsoft.Office.Interop.Excel.Workbook objWB = null;
            objXL = new Microsoft.Office.Interop.Excel.Application();
            objWB = objXL.Workbooks.Open(path);
            Microsoft.Office.Interop.Excel.Worksheet objSHT = objWB.Worksheets[1];
    
            int rows = objSHT.UsedRange.Rows.Count;
            int cols = objSHT.UsedRange.Columns.Count;
            DataTable dt = new DataTable();
            int noofrow = 1;
    
            for (int c = 1; c <= cols; c++)
            {
                string colname = objSHT.Cells[1, c].Text;
                dt.Columns.Add(colname);
                noofrow = 2;
            }
    
            for (int r = noofrow; r <= rows; r++)
            {
                DataRow dr = dt.NewRow();
                for (int c = 1; c <= cols; c++)
                {
                    dr[c - 1] = objSHT.Cells[r, c].Text;
                }
    
                dt.Rows.Add(dr);
            }
    
            objWB.Close();
            objXL.Quit();
            return dt;
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            DataTable table = READExcel("E:\\test.xlsx");
            dataGridView1.DataSource = table;
        }
    

    结果;

    【讨论】:

    • 哇,你们太棒了,我会试试你们的想法!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 2022-01-24
    • 2021-12-29
    相关资源
    最近更新 更多