【问题标题】:Save in Continue of CSV or Xlsx File继续保存 CSV 或 Xlsx 文件
【发布时间】:2012-04-13 09:36:24
【问题描述】:

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

例子:

Gridview 内容1:

保存在:第 1 - 255 列

Gridview 内容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!");
      }

【问题讨论】:

  • 您的网格视图在哪里?在您正在开发的单独应用中?
  • 你在开发你的应用程序是什么?你是如何访问excel的?您是否正在使用 C# 并通过互操作访问 Excel...?
  • 你能发布一些你如何“保存你的gridview”的代码吗?从那里也许有人可以帮助您将其扩展为您想要的追加
  • C#,是的 Excel Intropt 已使用,我想解决我可以使用 OLEDB 在 gridview 中导入的 255 列限制。我想,我可以在 gridview 的 255 列范围内加载我的数据并保存在文件中,然后为下一个 255 清除 gridview ,...
  • 你能发布你到目前为止的代码吗?

标签: excel gridview csv xlsx


【解决方案1】:
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 次迭代即可完成此操作。我希望这会有所帮助。

编辑:

好的,所以我认为您不应该使用网格视图。试试这个:

//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 索引的,这是不寻常的。

【讨论】:

  • 嘿,用我所有的 15000 列从 gridview 中保存是个好主意。但我需要 58 gridview 吗?或 58 次重新清理我的 gridview 并用新的 255 列再次填充(导入)。有什么方法可以在导入阶段转置数据?
  • 当然——像这样:codeproject.com/Articles/44274/Transpose-a-DataTable-using-C。但我不明白你为什么要使用gridview。只需使用互操作将数据读入 object[,] 数组。像这样: //打开工作表 Excel.Worksheet ws = (Excel.Worksheet)currentWorkbook.Worksheets["Sheet1"]; //从interop对象转换为native C#对象,索引1到length object[,] data = (object[,])ws.UsedRange.Value2;
  • 通过上述编辑,您不需要转置,也不需要使用 gridview。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多