با سلام و خسته نباشید
من یه پروژه سی شارپ نوشتم که فایل اکسل دریافت می کند و در دیتاگریدویو نمایش می دهد
این کد برای فایلهایی که با پسوند .xls هست درست کار میکنه ولی فایلهای با پسوند .xlsx رو اصلا نمایش نمی دهد و در ضمن خطایی هم نمیده؟
ممنون میشم راهنمایی کنید
با سپاس
if (extention==(".xls") || extention==(".xlsx")) { try { if (extention == (".xls")) { constr = @"provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filepath + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1';"; } else { if(extention==(".xlsx")) { constr = @"provider=Microsoft.ACE.OLEDB.12.0;Date Source=" + filepath + ";Extended Properties='Excel 12.0; ';"; } } using (OleDbConnection conn = new OleDbConnection(constr)) { try { OleDbDataAdapter oda = new OleDbDataAdapter("select * from [Sheet1$]", conn); oda.Fill(dt); } catch { } } dataGridView1.DataSource = dt; } catch { } }
کد زیر را امتحان کنید
DialogResult dialogResult = MessageBox.Show("Sure", "Some Title", MessageBoxButtons.YesNo); if (dialogResult == DialogResult.Yes) { dt = dsSource.Tables[Index]; dt.Reset(); Excel.Workbook workbook; Excel.Worksheet NwSheet; Excel.Range ShtRange; Microsoft.Office.Interop.Excel.Application ExcelObj = new Microsoft.Office.Interop.Excel.Application(); OpenFileDialog filedlgExcel = new OpenFileDialog(); filedlgExcel.Title = "Select file"; filedlgExcel.InitialDirectory = @"c:\"; //filedlgExcel.FileName = textBox1.Text; filedlgExcel.Filter = "Excel Sheet(*.xlsx)|*.xlsx|All Files(*.*)|*.*"; filedlgExcel.FilterIndex = 1; filedlgExcel.RestoreDirectory = true; if (filedlgExcel.ShowDialog() == DialogResult.OK) { workbook = ExcelObj.Workbooks.Open(filedlgExcel.FileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); NwSheet = (Excel.Worksheet)workbook.Sheets.get_Item(1); ShtRange = NwSheet.UsedRange; for (int Cnum = 1; Cnum <= ShtRange.Columns.Count; Cnum++) { dt.Columns.Add(new DataColumn((ShtRange.Cells[1, Cnum] as Excel.Range).Value2.ToString())); } dt.AcceptChanges(); string[] columnNames = new String[dt.Columns.Count]; for (int i = 0; i < dt.Columns.Count; i++) { columnNames[0] = dt.Columns[i].ColumnName; } //string[] columnNames = (from dc in dt.Columns.Cast<DataColumn>() select dc.ColumnName).ToArray(); for (int Rnum = 2; Rnum <= ShtRange.Rows.Count; Rnum++) { DataRow dr = dt.NewRow(); for (int Cnum = 1; Cnum <= ShtRange.Columns.Count; Cnum++) { if ((ShtRange.Cells[Rnum, Cnum] as Excel.Range).Value2 != null) { dr[Cnum - 1] = (ShtRange.Cells[Rnum, Cnum] as Excel.Range).Value2.ToString(); } } dt.Rows.Add(dr); dt.AcceptChanges(); } workbook.Close(true, Missing.Value, Missing.Value); ExcelObj.Quit(); dataGridView1.DataSource = dt;
این کدی که برام گذاشتین یکم سخته برام، چیزی متوجه نمیشم. ممنون میشم یه کد ساده تر برام بزارین.
آقای مدائنی کدی که شما گذاشتید وابسته به نصب بودن اکسل روی سیستم هست! آیا راه دیگه وجود داره که این وابستگی رو نداشته باشه؟
با تشکر
سلام
جواب رو پیدا کردم! توی ویژوآل استودیو با nuget پکیج NPOI رو نصب کنید. البته فایل های xlsx از 2007 به بعد رو باز میکنه اینجوری که نوشته. این هم روش استفاده از کتابخونه:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; // File.Exists() using NPOI.XSSF.UserModel; // XSSFWorkbook, XSSFSheet namespace Read___write_XLSX_via_NPOI___display_in_GRID { public partial class Form1 : Form { XSSFWorkbook wb; XSSFSheet sh; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // create xls if not exists if (!File.Exists("test.xlsx")) { wb = new XSSFWorkbook(); // create sheet sh = (XSSFSheet)wb.CreateSheet("Sheet1"); // 3 rows, 2 columns for (int i = 0; i < 3; i++) { var r = sh.CreateRow(i); for (int j = 0; j < 2; j++) { r.CreateCell(j); } } using (var fs = new FileStream("test.xlsx", FileMode.Create, FileAccess.Write)) { wb.Write(fs); } } // get sheets list from xlsx using (var fs = new FileStream("test.xlsx", FileMode.Open, FileAccess.Read)) { wb = new XSSFWorkbook(fs); for (int i = 0; i < wb.Count; i++) { comboBox1.Items.Add(wb.GetSheetAt(i).SheetName); } } } private void button1_Click(object sender, EventArgs e) { // clear grid before filling dataGridView1.Rows.Clear(); dataGridView1.Columns.Clear(); // get sheet sh = (XSSFSheet)wb.GetSheet(comboBox1.SelectedItem.ToString()); int i = 0; while (sh.GetRow(i) != null) { // add neccessary columns if (dataGridView1.Columns.Count < sh.GetRow(i).Cells.Count) { for (int j = 0; j < sh.GetRow(i).Cells.Count; j++) { dataGridView1.Columns.Add("", ""); } } // add row dataGridView1.Rows.Add(); // write row value for (int j = 0; j < sh.GetRow(i).Cells.Count; j++) { var cell = sh.GetRow(i).GetCell(j); if (cell != null) { // TODO: you can add more cell types capability, e. g. formula switch (cell.CellType) { case NPOI.SS.UserModel.CellType.Numeric: dataGridView1[j, i].Value = sh.GetRow(i).GetCell(j).NumericCellValue; break; case NPOI.SS.UserModel.CellType.String: dataGridView1[j, i].Value = sh.GetRow(i).GetCell(j).StringCellValue; break; } } } i++; } } private void button2_Click(object sender, EventArgs e) { for (int i = 0; i < dataGridView1.RowCount - 1; i++) { if (sh.GetRow(i) == null) sh.CreateRow(i); for (int j = 0; j < dataGridView1.ColumnCount; j++) { if (sh.GetRow(i).GetCell(j) == null) sh.GetRow(i).CreateCell(j); if (dataGridView1[j, i].Value != null) { sh.GetRow(i).GetCell(j).SetCellValue(dataGridView1[j, i].Value.ToString()); } } } using (var fs = new FileStream("test.xlsx", FileMode.Open, FileAccess.Write)) { wb.Write(fs); } } } }
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)