0

グリッドビューを更新してから、グリッドビューのコンテンツをcsvまたはxlsxファイルの続行に保存します。その後、グリッドビューを再度更新し、ファイルの続きにコンテンツを保存します。

例 :

Gridviewコンテンツ1:

保存先:列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!");
      }
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回の反復でのみ実行できます。これがお役に立てば幸いです。

編集:

OK、グリッドビューを使用するべきではないと思います。これを試して:

//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;

エクスポート段階でグリッドビューの代わりにデータをループし、書き込む前に各値に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 [、]は、0ではなく1からインデックス付けされていることに注意してください。これは珍しいことです。

于 2012-04-13T11:15:29.227 に答える