2017-01-05 4 views
0

エクセルファイルの列を並べ替えるためのアプリケーションを作成しました。問題は、ファイルを保存すると、たとえdatagridviewが必要な場合でも、エクスポートされたファイルは最初のファイルとまったく同じです。エクセルファイルをインポートし、列レイアウトを再配置し、新しいレイアウトをエクセルに書き戻します。

誰かが私が間違っている場所を教えてもらえますか?

ここ

コードです:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using Excel; 
using System.IO; 
using Microsoft.Office.Tools.Excel; 
using System.Data.SqlClient; 
using System.Configuration; 
namespace ReadExcelFiles 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     DataSet result; 
     private void btnOpen_Click(object sender, EventArgs e) 
     { 
      //========================================================== 
      //CODE FOR IMPORTING DATA TO DATAGRIDVIEW=================== 
      //========================================================== 
      using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "Excel Workbook|*.xls", ValidateNames = true }) 
      { 
       if (ofd.ShowDialog() == DialogResult.OK) 
       { 
        FileStream fs = File.Open(ofd.FileName, FileMode.Open, FileAccess.Read); 
        IExcelDataReader reader = ExcelReaderFactory.CreateBinaryReader(fs); 
        reader.IsFirstRowAsColumnNames = true; 
        result = reader.AsDataSet(); 
        cboSheet.Items.Clear(); 
        foreach (DataTable dt in result.Tables) 
         cboSheet.Items.Add(dt.TableName); 
        reader.Close(); 
       } 
      } 
     } 

     private void cboSheet_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      //================================================ 
      //CODE FOR SHEET FILTER=========================== 
      //================================================ 
      dataGridView.DataSource = result.Tables[cboSheet.SelectedIndex]; 
     } 

     private void btnArg_Click(object sender, EventArgs e) 
     { 
      //============================================== 
      //CODE FOR COLUMN SORTING ====================== 
      //============================================== 
      dataGridView.Columns["BUYER_NAME"].DisplayIndex = 0; 
      dataGridView.Columns["PO_NUMBER"].DisplayIndex = 1; 
      dataGridView.Columns["PO_LINE_NUMBER"].DisplayIndex = 2; 
      dataGridView.Columns["VENDOR_NAME"].DisplayIndex = 3; 
      dataGridView.Columns["INVOICE_NUM"].DisplayIndex = 4; 
      dataGridView.Columns["INVOICE_DATE"].DisplayIndex = 5; 
      dataGridView.Columns["HOLD_LOOKUP_CODE"].DisplayIndex = 6; 
      dataGridView.Columns["AGING_DAYS"].DisplayIndex = 7; 
      dataGridView.Columns["INVOICE_AMOUNT"].DisplayIndex = 8; 
      dataGridView.Columns["INVOICE_CURRENCY_CODE"].DisplayIndex = 9; 
      dataGridView.Columns["INVOICE_CREATION_DATE"].DisplayIndex = 10; 
      dataGridView.Columns["TERMS"].DisplayIndex = 11; 
      dataGridView.Columns["BASE_AMOUNT"].DisplayIndex = 12; 
      dataGridView.Columns["OU"].DisplayIndex = 13; 
      dataGridView.Columns["SOURCE"].DisplayIndex = 14; 
      dataGridView.Columns["STYLE_NAME"].DisplayIndex = 15; 
      dataGridView.Columns["INVOICE_ID"].DisplayIndex = 16; 
      dataGridView.Columns["HELD_BY"].DisplayIndex = 17; 
      dataGridView.Columns["FULL_NAME_HELD_BY"].DisplayIndex = 18; 
      dataGridView.Columns["CURRENT_MARKVIEW_OWNER"].DisplayIndex = 19; 
      dataGridView.Columns["BUYER_ORG"].DisplayIndex = 20; 
      dataGridView.Columns["LAST_UPDATED_BY"].DisplayIndex = 21; 
      dataGridView.Columns["FULL_NAME_LAST_UPDATED_BY"].DisplayIndex = 22; 
     } 

     private void btnSave_Click(object sender, EventArgs e) 
     { 
      //================================================ 
      //CODE TO EXPORT DATAGRID TO EXCEL======= ======== 
      //================================================  
      // Creating a Excel object. 
      Microsoft.Office.Interop.Excel._Application excel = new Microsoft.Office.Interop.Excel.Application(); 
      Microsoft.Office.Interop.Excel._Workbook workbook = excel.Workbooks.Add(Type.Missing); 
      Microsoft.Office.Interop.Excel._Worksheet worksheet = null; 
      try 
      { 

       worksheet = workbook.ActiveSheet; 

       worksheet.Name = "ExportedFromDatGrid"; 

       int cellRowIndex = 1; 
       int cellColumnIndex = 1; 

       //Loop through each row and read value from each column. 
       for (int i = 0; i < dataGridView.Rows.Count - 1; i++) 
       { 
        for (int j = 0; j < dataGridView.Columns.Count; j++) 
        { 
         // Excel index starts from 1,1. As first Row would have the Column headers, adding a condition check. 
         if (cellRowIndex == 1) 
         { 
          worksheet.Cells[cellRowIndex, cellColumnIndex] = dataGridView.Columns[j].HeaderText; 
         } 
         else 
         { 
          worksheet.Cells[cellRowIndex, cellColumnIndex] = dataGridView.Rows[i].Cells[j].Value.ToString(); 
         } 
         cellColumnIndex++; 
        } 
        cellColumnIndex = 1; 
        cellRowIndex++; 
       }  
       //Getting the location and file name of the excel to save from user. 
       SaveFileDialog saveDialog = new SaveFileDialog(); 
       saveDialog.Filter = "Excel files (*.xlsx)|*.xlsx|All files (*.*)|*.*"; 
       saveDialog.FilterIndex = 2;  
       if (saveDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
       { 
        workbook.SaveAs(saveDialog.FileName); 
        MessageBox.Show("Export Successful"); 
       } 
      } 
      catch (System.Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
      finally 
      { 
       excel.Quit(); 
       workbook = null; 
       excel = null; 
      } 
     } 
    } 
} 

答えて

0

あなたがExcelワークシートで列を再編成するよりも、ここで他を達成する必要が正確に何明確ではありません。なぜ2つの異なるExcelライブラリを使用するのかと疑問に思っていますか?エクセルファイルを開くサードパーティのライブラリを開き、Interopを使用してファイルを保存しますか?疑問に思うだけでは本当に無関係です。

DataGridViewを導入することも奇妙に思えます。 Excelワークシートの列を新しいExcelファイルに並べ替えるには...単にExcelファイルを開き、新しいExcelファイルを作成して、必要に応じて列をコピーします。この画像にDataGridViewを導入する必要はないようです。

あなたが列(あなたがそうであるように)再オーダーするためにDataGridView内のデータを持っている必要がある場合、あなたはあなたがDataGridView年代DataSourceを設定するときに何が起こるかを認識する必要があります。あなたは以下の行を使用する場合:

dataGridView.DataSource = result.Tables[cboSheet.SelectedIndex]; 

ラインは、上記のコンボボックスで選択したテーブルにDataGridViewのデータソースを設定します。 DataGridViewDataTableにバインドされている場合、DataGridViewの実際のセルは、あなたが考えると実際にはアクセスできません。 DataGridViewの列を並べ替えると(btnArg_Clickイベントの場合)、列はDataGridViewで変更されますが、グリッドがバインドされているデータテーブルでは同じではありません...変更されません。だから、ときDataGridViewをループし、以下のように各セルに対応:...

worksheet.Cells[cellRowIndex, cellColumnIndex] = dataGridView.Rows[i].Cells[j].Value.ToString(); 

これは、データテーブルにijにマッチします、そしてそれは変わっていないので、あなたはあなたが開始したのと同じExcelワークシートを取得します。私はあなたが以下のコードでやっていると仮定して、あなたがDataGridViewの列の順序を変更する場合:

private void btnArg_Click(object sender, EventArgs e) { 
    dataGridView.Columns["BUYER_NAME"].DisplayIndex = 0; 
    dataGridView.Columns["PO_NUMBER"].DisplayIndex = 1; 
    . 
    . 
    . 

...データテーブルへのインデックスがDataGridViewにインデックスが一致しません。データテーブルはそのまま残され、変更されません。好きな列に便利に列DisplayIndexを設定しているので、これを使って新しいExcelファイルを作成するときに取得する列を特定できます。

btnSave_Clickコードに変更した値をDisplayIndexで作成しました。それは期待どおりに動作するはずですが、私はこれを実現する最も簡単な方法があると確信しています。 DataTableの列を並べ替えるほうが簡単かもしれません。ちょうど提案...おそらく最善の提案ではない。あなたはLINQを見たいかもしれません。

次のコードの変更はで構成されています 1)は、新しいExcelファイルの作成を示すために、

excel.Visible = true; 

を追加しました。彼らがDataGridViewのために変更されているので、適切な列を取得するには、現在の列DisplayIndexを取得するために使用され

int tableCol = -1; 

2)int変数tableColを追加しました。

3)新しいExcelワークシートにデータを書き込むときに、2つのforループの2行を変更しました。行ヘッダーの最初の行とデータの2行目。ヘッダーを取得するために同じループを使用しているので、2行目で "i"を減らす必要があります。そうしないと、最初の行が欠落します。これもやはりハック的なアプローチであり、ヘッダーを最初にそれ自身のループで印刷するほうが簡単かもしれません。

// Headers 
worksheet.Cells[cellRowIndex, cellColumnIndex] = dataGridView.Columns[tableCol].HeaderText; 
// Data 
worksheet.Cells[cellRowIndex, cellColumnIndex] = dataGridView.Rows[i-1].Cells[tableCol].Value.ToString(); 

更新btn_Saveイベント:

private void btnSave_Click(object sender, EventArgs e) { 
    //================================================ 
    //CODE TO EXPORT DATAGRID TO EXCEL======= ======== 
    //================================================  
    // Creating a Excel object. 
    Microsoft.Office.Interop.Excel._Application excel = new Microsoft.Office.Interop.Excel.Application(); 
    Microsoft.Office.Interop.Excel._Workbook workbook = excel.Workbooks.Add(Type.Missing); 
    Microsoft.Office.Interop.Excel._Worksheet worksheet = null; 
    excel.Visible = true; 

    try { 
    worksheet = workbook.ActiveSheet; 
    worksheet.Name = "ExportedFromDatGrid"; 
    int cellRowIndex = 1; 
    int cellColumnIndex = 1; 
    int tableCol = -1; 
    //Loop through each row and read value from each column. 
    for (int i = 0; i < dataGridView.Rows.Count; i++) { 
     for (int j = 0; j < dataGridView.Columns.Count; j++) { 
     // Excel index starts from 1,1. As first Row would have the Column headers, adding a condition check. 
     tableCol = dataGridView.Columns[j].DisplayIndex; 
     if (cellRowIndex == 1) { 
      //worksheet.Cells[cellRowIndex, cellColumnIndex] = dataGridView.Columns[j].HeaderText; 
      worksheet.Cells[cellRowIndex, cellColumnIndex] = dataGridView.Columns[tableCol].HeaderText; 
     } 
     else { 
      //worksheet.Cells[cellRowIndex, cellColumnIndex] = dataGridView.Rows[i].Cells[j].Value.ToString(); 
      worksheet.Cells[cellRowIndex, cellColumnIndex] = dataGridView.Rows[i-1].Cells[tableCol].Value.ToString(); 
     } 
     cellColumnIndex++; 
     } 
     cellColumnIndex = 1; 
     cellRowIndex++; 
    } 
    //Getting the location and file name of the excel to save from user. 
    SaveFileDialog saveDialog = new SaveFileDialog(); 
    saveDialog.Filter = "Excel files (*.xlsx)|*.xlsx|All files (*.*)|*.*"; 
    saveDialog.FilterIndex = 2; 
    if (saveDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { 
     workbook.SaveAs(saveDialog.FileName); 
     MessageBox.Show("Export Successful"); 
    } 
    } 
    catch (System.Exception ex) { 
    MessageBox.Show(ex.Message); 
    } 
    finally { 
    excel.Quit(); 
    workbook = null; 
    excel = null; 
    } 
} 

は、この情報がお役に立てば幸い!

+0

ありがとう、ジョン。 Interopを使用し、視覚効果のために追加したDataGridViewを除外することに焦点を当てます。 2つの異なるExcelライブラリに関するご質問については、あなたが気付いたと思いますが、私はC#の初心者です。あなたの答えをありがとう! – IzyDece

関連する問題