Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从数据表创建Excel工作表_C#_Excel_Winforms_Datatable_Excel Interop - Fatal编程技术网

C# 从数据表创建Excel工作表

C# 从数据表创建Excel工作表,c#,excel,winforms,datatable,excel-interop,C#,Excel,Winforms,Datatable,Excel Interop,我正面临一个奇怪的现象。 我编写了一个将值从datatable复制到excel工作表的方法。 问题是行复制到列,列复制到行 例如: 数据表: Item Quantity UnitPrice TotalPrice A 10 2 20 B 3 15 45 C 100 0.5 50 Excel表格: Item Quantity UnitPr

我正面临一个奇怪的现象。 我编写了一个将值从datatable复制到excel工作表的方法。 问题是行复制到列,列复制到行

例如:

数据表:

Item   Quantity    UnitPrice   TotalPrice
A      10          2           20
B      3           15          45
C      100         0.5         50
Excel表格:

Item   Quantity    UnitPrice   TotalPrice
A      B          C           
10     3          100          
2      15         0.5         
20     45         50
我的代码:

 private void PopulateDataWorkSheet()
        {
        xl.Workbooks xlWorkbooks = _xlApp.Workbooks;
        xl.Workbook xlWorkbook = xlWorkbooks.Open(_excelFileName);
        xl.Sheets xlSheets = xlWorkbook.Sheets;
        const int startRowIndex = 2;    // first row for columns title
        const int startColumnIndex = 1;

        xl.Worksheet xlDataWorkSheet = xlSheets[DATA_SHEET];
        xl.Range xlCells = xlDataWorkSheet.Cells;

        for (var rowindex = 0; rowindex < _datatable.Rows.Count; rowindex++)
        {
            for (var columnindex = 0; columnindex < _datatable.Columns.Count; columnindex++)
            {
                xlCells[startRowIndex + rowindex][startColumnIndex + columnindex] = _datatable.Rows[rowindex][columnindex];
            }
        }

        xlWorkbook.Save();
        xlWorkbook.Close();
        xlWorkbooks.Close();

        ReleaseExcelObject(xlCells);
        ReleaseExcelObject(xlDataWorkSheet);
        ReleaseExcelObject(xlSheets);
        ReleaseExcelObject(xlWorkbook);
        ReleaseExcelObject(xlWorkbooks);
    }

我的代码中遗漏了什么吗?

你做错了,你需要这样做:

                for (var columnindex = 0; columnindex < _datatable.Columns.Count; columnindex++)
                {
                    for (var rowindex = 0; rowindex < _datatable.Rows.Count; rowindex++)
                    {
                            xlCells[startRowIndex + rowindex][startColumnIndex + columnindex] = _datatable.Rows[rowindex][columnindex];
                    }
                }
for(var columnindex=0;columnindex<\u datatable.Columns.Count;columnindex++)
{
对于(var rowindex=0;rowindex<\u datatable.Rows.Count;rowindex++)
{
xlCells[startRowIndex+rowindex][startColumnIndex+columnindex]=\u datatable.Rows[rowindex][columnindex];
}
}

您需要列,然后是行。

您需要更改访问excel单元格的方式。
单元格[StartRowIndex+rowindex,StartColumnIndex+columnindex]
先行后列。您要做的是
单元格[StartRowIndex+rowindex][StartColumnIndex+columnindex]
,它将列作为第一个参数

循环的顺序根本不重要。。因此,正确的解决方案是:

  for (var rowindex = 0; rowindex < _datatable.Rows.Count; rowindex++)
        {
            for (var columnindex = 0; columnindex < _datatable.Columns.Count; columnindex++)
            {
                xlCells[startRowIndex + rowindex, startColumnIndex + columnindex] = _datatable.Rows[rowindex][columnindex];
            }
        }
for(var rowindex=0;rowindex<\u datatable.Rows.Count;rowindex++)
{
对于(var columnindex=0;columnindex<\u datatable.Columns.Count;columnindex++)
{
xlCells[startRowIndex+rowindex,startColumnIndex+columnindex]=\u datatable.Rows[rowindex][columnindex];
}
}
干杯

我正面临一个奇怪的现象。我的代码中遗漏了什么吗

欢迎来到Excel
范围、动力学、可选参数和COM对象
默认值
成员概念的世界

Excel
Range
是一个奇怪的东西。几乎每个方法/属性都返回另一个范围。您使用的索引器是这样的

dynamic this[object RowIndex, object ColumnIndex = Type.Missing] { get; set; }
i、 e.具有必需的行索引和可选的列索引

让我们接这个电话

xlCells[startRowIndex + rowindex][startColumnIndex + columnindex] = ...;
它相当于这样的东西

var range1 = (Excel.Range)xlCells[startRowIndex + rowindex];
var range2 = (Excel.Range)range1[startColumnIndex + columnindex];
//                               ^^^^^^
// this is treated as row index offset from the range1
range2.Value2 = ...;
很快,您需要将其更改为

xlCells[startRowIndex + rowindex, startColumnIndex + columnindex] = ...;

你可以使用下面的代码来解决这个问题。它对我来说很好

                xlApplication = new Microsoft.Office.Interop.Excel.Application();

                // Create workbook .  
                xlWorkBook = xlApplication.Workbooks.Add(Type.Missing);

                // Get active sheet from workbook  
                xlWorkSheet = xlWorkBook.ActiveSheet;
                xlWorkSheet.Name = "Report";
                xlWorkSheet.Columns.ColumnWidth = 30;


                xlApplication.DisplayAlerts = false;
                for (int rowIndex = 0; rowIndex < gridViewDataTable.Rows.Count; rowIndex++)
                {
                    for (int colIndex = 0; colIndex < gridViewDataTable.Columns.Count; colIndex++)
                    {
                        if (rowIndex == 0)
                        {
                            xlWorkSheet.Cells[rowIndex + 1, colIndex + 1] = gridViewDataTable.Columns[colIndex].ColumnName;
                            xlWorkSheet.Cells[rowIndex + 1, colIndex + 1].Interior.Color = System.Drawing.Color.LightGray;
                        }
                        xlWorkSheet.Cells[rowIndex + 2, colIndex + 1].Borders.Color = Color.Black;
                        xlWorkSheet.Cells[rowIndex + 2, colIndex + 1].Interior.Color = System.Drawing.Color.White;
                        xlWorkSheet.Cells[rowIndex + 2, colIndex + 1] = gridViewDataTable.Rows[rowIndex][colIndex];  
                    }
                }
                xlWorkBook.SaveAs(filename);
                xlWorkBook.Close();
                xlApplication.Quit();
xlApplication=new Microsoft.Office.Interop.Excel.Application();
//创建工作簿。
xlWorkBook=xlApplication.Workbooks.Add(Type.Missing);
//从工作簿获取活动工作表
xlWorkSheet=xlWorkBook.ActiveSheet;
xlWorkSheet.Name=“报告”;
xlWorkSheet.Columns.ColumnWidth=30;
xlApplication.DisplayAlerts=false;
对于(int rowIndex=0;rowIndex
不,你错了。不管你以什么顺序得到索引,重要的是你如何插入它。你测试过吗?想想看,在一个3X3的表中,你需要在(0,0)->(1,0)->(2,0)->(0,1)->等等…,所以前面的列。这很重要,因为你需要在列之前增加行。是的,我认为这是错误的,因为xlCells的索引也会相应地反转。可以肯定的是,我检查过了,它不工作了,雷利,好吧。。。异常抛出?你的意思是range1实际上是index=current rowindex的整个列吗?嗯,我不是100%确定
ColumnIndex
的默认处理方式。如果没有指定,range1
的动态视图将显示
Count=1
column=1
。欢迎您。如果您在某个时候遇到上述性能问题,您可以查看我的答案,了解更快的技术,在您的情况下,该技术可以与
DataRow.ItemArray
结合使用。
                xlApplication = new Microsoft.Office.Interop.Excel.Application();

                // Create workbook .  
                xlWorkBook = xlApplication.Workbooks.Add(Type.Missing);

                // Get active sheet from workbook  
                xlWorkSheet = xlWorkBook.ActiveSheet;
                xlWorkSheet.Name = "Report";
                xlWorkSheet.Columns.ColumnWidth = 30;


                xlApplication.DisplayAlerts = false;
                for (int rowIndex = 0; rowIndex < gridViewDataTable.Rows.Count; rowIndex++)
                {
                    for (int colIndex = 0; colIndex < gridViewDataTable.Columns.Count; colIndex++)
                    {
                        if (rowIndex == 0)
                        {
                            xlWorkSheet.Cells[rowIndex + 1, colIndex + 1] = gridViewDataTable.Columns[colIndex].ColumnName;
                            xlWorkSheet.Cells[rowIndex + 1, colIndex + 1].Interior.Color = System.Drawing.Color.LightGray;
                        }
                        xlWorkSheet.Cells[rowIndex + 2, colIndex + 1].Borders.Color = Color.Black;
                        xlWorkSheet.Cells[rowIndex + 2, colIndex + 1].Interior.Color = System.Drawing.Color.White;
                        xlWorkSheet.Cells[rowIndex + 2, colIndex + 1] = gridViewDataTable.Rows[rowIndex][colIndex];  
                    }
                }
                xlWorkBook.SaveAs(filename);
                xlWorkBook.Close();
                xlApplication.Quit();