0

我想更新我的 gridview,然后将 gridview 内容保存在我的 csv 或 xlsx 文件的 continue 中。之后再次更新我的gridview,然后将内容保存在文件的继续:

例子 :

网格视图内容1:

保存在:第 1 列 - 255

网格视图内容2:

保存在:第 256 - 500 列

...

我怎样才能保存在同一文件的继续???(不要覆盖过去的列)

前我的英语不好:)

我的保存代码:

        Microsoft.Office.Interop.Excel.ApplicationClass ExcelApp = new Microsoft.Office.Interop.Excel.ApplicationClass();

        ExcelApp.Application.Workbooks.Add(Type.Missing);

        ExcelApp.Columns.ColumnWidth = 20;

        for (int i = 0; i < dataGridView1.Rows.Count; i++)
        {

            for (int j = 0; j < dataGridView1.Rows[0].Cells.Count; j++)
            {

                ExcelApp.Cells[i + 1, j + 1] = dataGridView1.Rows[i].Cells[j].Value.ToString();

            }

        }

        if (!textBox1.Text.Contains(".xlsx"))
        {
            textBox1.Text = textBox1.Text.Replace(".xls", ".xlsx");
        }

        ExcelApp.ActiveWorkbook.SaveCopyAs(textBox1.Text);

        ExcelApp.ActiveWorkbook.Saved = true;

        ExcelApp.Quit();

我从 excel 文件导入(选择列范围为 255):

            string connectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 8.0;HDR=NO;IMEX=1;""", txtPath.Text);
            string query = String.Format("select * from [CA:DA]", "Sheet1");
            OleDbDataAdapter dataAdapter = new OleDbDataAdapter(query, connectionString);
            DataSet dataSet = new DataSet();
            dataAdapter.Fill(dataSet);
            dataGridView1.DataSource = dataSet.Tables[0];

这导致了大的excel文件!它有 15000 列!

try
        {

            for (int row = 0; row <= dataGridView1.RowCount-1; row++)
            {
                for (int cell = 0; cell <= dataGridView1.Rows[0].Cells.Count-1; cell++)
                {         
                    string cellst = dataGridView1.Rows[row].Cells[cell].Value.ToString();
                    dataGridView1.Rows[row].Cells[cell].Value = Int64.Parse(cellst) + 1;

                    }
                }
            }

        catch
        {
            MessageBox.Show("Data Format Error. Please Review your file for not numeric data!");
      }
4

1 回答 1

0
for (int chunk = 0; chunk < TotalColumnsToImport/255; chunk++)             
{
            for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {

                for (int j = 0; j < dataGridView1.Rows[0].Cells.Count; j++)
                {

                    ExcelApp.Cells[i + 1, chunk * 255 + j + 1] = dataGridView1.Rows[i].Cells[j].Value.ToString();

                }

            }
}

我不知道我是否真的了解您的要求,但据我所知,这就是您需要做的一切。您正在以 255 列的块导入数据,因此只需在外部添加另一个循环,跟踪您所在的块,然后按块数乘以 255 来设置列。在您的情况下,循环中使用的 TotalColumnsToImport 变量上限为 15000。

您在导入数据时转置数据并在导出数据时再次转置数据的建议是一个很好的建议。在这种情况下, TotalColumnsToImport 变为 900,就像您说的那样,您只需 4 次迭代即可完成此操作。我希望这有帮助。

编辑:

好的,所以我认为您不应该使用gridview。尝试这个:

//Open the worksheet
            Excel.Worksheet ws = (Excel.Worksheet)currentWorkbook.Worksheets["Sheet1"];

            //Convert from interop object to native C# object, indexed 1 to length
            object[,] data = (object[,])ws.UsedRange.Value2;

现在循环遍历数据,而不是导出阶段中的 gridview,并在编写它们之前将每个值加 1:

for (int i = 1; i < data.GetLength(0); i++)
    {

        for (int j = 1; j < data.GetLength(1); j++)
        {

            ExcelApp.Cells[i, j] = (int)data[i,j] + 1;

        }

    }

您可能需要对铸件进行一些调整,但它应该可以工作并且速度更快。另请注意, data[,] 是从 1 而不是 0 索引的,这是不寻常的。

于 2012-04-13T11:15:29.227 回答