エクセルファイルの列を並べ替えるためのアプリケーションを作成しました。問題は、ファイルを保存すると、たとえ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;
}
}
}
}
ありがとう、ジョン。 Interopを使用し、視覚効果のために追加したDataGridViewを除外することに焦点を当てます。 2つの異なるExcelライブラリに関するご質問については、あなたが気付いたと思いますが、私はC#の初心者です。あなたの答えをありがとう! – IzyDece