Ich habe eine App erstellt, die mir hilft, die Spalten in einer Excel-Datei neu anzuordnen. Das Problem ist, dass die exportierte Datei genau wie die ursprüngliche Datei ist, wenn ich die Datei speichere, selbst wenn die Datagridansicht so ist, wie ich es möchte.Importieren Sie eine Excel-Datei, ordnen Sie das Spaltenlayout neu und exportieren Sie das neue Layout zurück nach Excel
Kann mir jemand sagen, wo ich falsch liege? Hier
ist der Code:
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;
}
}
}
}
Danke, John. Ich werde mich auf die Verwendung von Interop konzentrieren und DataGridView ausschließen, die ich nur für den visuellen Effekt hinzugefügt habe. Was deine Frage zu den zwei verschiedenen Excel-Bibliotheken anbelangt, so denke ich, dass du bemerkt hast, dass ich ein Neuling in C# bin und ich von verschiedenen Quellen inspiriere, jeder mit seinem einen Ansatz. Vielen Dank für Ihre Antwort! – IzyDece