保存在CSV或Xlsx文件的继续中

时间:2012-04-13 09:36:24

标签: excel gridview csv xlsx

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

示例:

Gridview content1:

保存在:第1列 - 第255行

Gridview content2:

保存在: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!");
      }

1 个答案:

答案 0 :(得分: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;

        }

    }

你可能不得不在演员表中略微提一下,但它应该有效并且要快得多。另请注意,数据[,]从1开始索引,而不是0,这是不寻常的。

相关问题