ผมจะดึงไฟล์ Excel ที่เปิดอยู่มาลงใน DataGridView ได้ยังไงครับ
มีวิธีเดียวต้องก็อปปี้ไฟล์ ทั้งหมดนั้น มาไว้ที่เครื่องก่อนดึงลง Datagrid
ทำเป็นหน่วงเวลา ให้ทำการก็อปปี้ ทุกๆ 20 นาที ก็ได้ครับ ประมาณว่า 20 นาที อัพเดทการทำงาน 1 ครั้ง
หรือท่านอื่นมีวิธีไหนรอคนมาตอบครับ
ปล.ผมว่าแค่เปิดไฟล์พวกนั้นแล้วดึงเฉยๆผมว่าไม่น่าจะมีปัญหานะ ขอดูโค้ดหน่อยครับ
ประวัติการแก้ไข 2014-09-04 16:23:37
Date :
2014-09-04 16:22:03
By :
zarooman
โค๊ด ประมาณนี้ครับ
เก็บไฟล์ทั้งหมดไว้ใน แลน ชื่อโฟลเดอร์ AllReport โดยไฟล์ให้ใช้ นามสกุล .Report เพื่อไม่ให้สับสนกับงานอื่น
list ไฟล์ออกมา จากนั้นก็แค่อ่านไฟล์ ลงใน Datatable ส่วนใหญ่จะติดที่ GetTable เพราะมีบางไฟล์เปิดอยู่
Code (C#)
private void RefreshData()
{
Cursor = Cursors.WaitCursor;
List<string> _file = new List<string>();
_file = TORServices.clsFile_Path.GetFilesRecursive(TORServices.clsPathData.Path_AllReport, "*.Report");///@"H:\REPORT"
if (_file.Count <= 0) { Cursor = Cursors.Default; return; }
if (dt != null) { dt = null; }
dt = new DataTable();
dt.Columns.Add(new DataColumn("SampleID",typeof(string)));
dt.Columns.Add(new DataColumn("Parameter", typeof(string)));
dt.Columns.Add(new DataColumn("Value", typeof(string)));
dt.Columns.Add(new DataColumn("Date", typeof(string)));
dt.Columns.Add(new DataColumn("ผู้วิเคราะห์", typeof(string)));
dt.Columns.Add(new DataColumn("Seleced", typeof(Boolean)));
foreach(string f in _file)
{
dgvmgKg.DataSource = GetTable("SELECT * FROM `mg_Kg$Print_Area`", f).DefaultView;
dgvmgL.DataSource = GetTable("SELECT * FROM `mg_L$Print_Area`", f).DefaultView;
for (int i = 0; i < this.dgvmgL.RowCount - 1; i++)
{
if (this.dgvmgL[this.dgvmgL.ColumnCount - 1, i].Value.ToString().Trim().Length != 0)
{
DataRow dr = dt.NewRow();
dr["SampleID"] = this.dgvmgL[this.dgvmgL.ColumnCount - 6, i].Value.ToString().Trim();
dr["Parameter"] = this.dgvmgL[this.dgvmgL.ColumnCount - 5, i].Value.ToString().Trim();
dr["Value"] = this.dgvmgL[this.dgvmgL.ColumnCount - 4, i].Value.ToString().Trim();
dr["Date"] = this.dgvmgL[this.dgvmgL.ColumnCount - 3, i].Value.ToString().Trim();
dr["ผู้วิเคราะห์"] = this.dgvmgL[this.dgvmgL.ColumnCount - 2, i].Value.ToString().Trim();
dr["Seleced"] = false;
dt.Rows.Add(dr);
}
}
for (int i = 0; i < this.dgvmgKg.RowCount - 1; i++)
{
if (this.dgvmgKg[this.dgvmgKg.ColumnCount - 1, i].Value.ToString().Trim().Length != 0)
{
DataRow dr = dt.NewRow();
dr["SampleID"] = this.dgvmgKg[this.dgvmgKg.ColumnCount - 6, i].Value.ToString().Trim();
dr["Parameter"] = this.dgvmgKg[this.dgvmgKg.ColumnCount - 5, i].Value.ToString().Trim();
dr["Value"] = this.dgvmgKg[this.dgvmgKg.ColumnCount - 4, i].Value.ToString().Trim();
dr["Date"] = this.dgvmgKg[this.dgvmgKg.ColumnCount - 3, i].Value.ToString().Trim();
dr["ผู้วิเคราะห์"] = this.dgvmgKg[this.dgvmgKg.ColumnCount - 2, i].Value.ToString().Trim();
dr["Seleced"] = false;
dt.Rows.Add(dr);
}
}
}
dataGridView1.DataSource =dt ;
dataGridView1.Columns[3].Width = 120;
dataGridView1.Columns[4].Width = 150;
dataGridView1.Columns[5].Width = 60;
dataGridView1.Sort(dataGridView1.Columns[0], ListSortDirection.Ascending);
Cursor = Cursors.Default;
}
private System.Data.DataTable GetTable(string _SQL, string FileExcel)
{
string _ConnectionString = @"Data Source=" + FileExcel + "; Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;";
System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(_ConnectionString);
conn.Open();
string strQuery = _SQL;
System.Data.OleDb.OleDbDataAdapter adapter = new System.Data.OleDb.OleDbDataAdapter(strQuery, conn);
System.Data.DataSet ds = new System.Data.DataSet();
adapter.Fill(ds);
return ds.Tables[0];
}
Date :
2014-09-04 17:12:05
By :
lamaka.tor
ยังไม่ได้เลยคร้าบช่วยหน่อย
ขอแค่เอาข้อมูลจากไฟล์ Excel ที่เปิดมาใช้งานได้ก็พอแล้วครับ
ตอนนี้ด่วนมาก
Date :
2014-09-05 08:32:55
By :
lamaka.tor
อันนี้ไม่เคยทำจริงๆครับ แนะนำก่อนจะ Get Table แทนที่เราจะไปเปิดจากวงแลน เรามาเปิดในเครื่องเราดีกว่า ให้ทำการก็อปปี้ โฟลเดอร์ Allreport มาไว้ยังเครื่องเราแล้วค่อยเปิดอีกที
ประวัติการแก้ไข 2014-09-05 08:50:54 2014-09-05 08:51:23
Date :
2014-09-05 08:45:02
By :
zarooman
ขอบคุณครับเด๋วลองทำดู
ก่อนเที่ยงแจ้งผลให้ทราบอีกทีครับ
Date :
2014-09-05 08:47:26
By :
lamaka.tor
ไปเจอลิงค์นี้มา ลองใช้ดูครับไม่เห็นมี GetTable
http://stackoverflow.com/questions/16293643/import-excel-to-datagridview
Date :
2014-09-05 08:51:36
By :
zarooman
File ไหนที่เปิดใช้งานอยู่ก็ไม่ต้องไปเปิดมัน
Code (C#)
public static bool IsFileLocked(FileInfo file)
{
FileStream stream = null;
try
{
stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch (IOException)
{
//the file is unavailable because it is:
//still being written to
//or being processed by another thread
//or does not exist (has already been processed)
return true;
}
finally
{
if (stream != null)
stream.Close();
}
//file is not locked
return false;
}
Date :
2014-09-05 08:53:56
By :
zarooman
ผมก็เอาโค๊ดมาจากเว็บนั้นแหละครับแต่มาดัดแปลงเป็นให้ส่งค่าออกมาเป็น Datatable ครับ
จะอ่านไฟล์โดยใช้ interop.excel ก็พอได้ยุครับแต่นานพอสมควร
คือเราไม่รู้ว่าคนเปิดอ่านจะเปิดอ่านตอนไหน
ครั้งผมจะก๊อบไปวางที่ Temp ก็จะติดที่ว่าข้อมูลมันเยอะ 500 กว่าไฟล์ 800 กว่าเม็กครับ
จะก๊อบทีเดียวเปิดอ่านทั้งวันก็ไม่ได้เพราะไฟล์ Excel มีคนอัพเดทข้อมูลตลอดเวลา
ถ้าจะก๊อบก็ต้องก๊อบทุกครั้งที่สั่งรีเฟชดาต้า
แบบนั้นก็ต้องเจอขยะกองโตที่ Temp อีกอ่ะครับ
เป็นนักวิทย์สบายอยู่แท้ๆดันมาหาเรื่องปวดหัว 5555
ประเด็นมีอยู่แค่นี้ครับ
ผมเป็นนักวิทย์ ในหน่วยงานมี 5 แผนก แต่ละแผนกใช้ฟอร์มคำนวนผลไม่เหมือนกันครับ
ผมจะยกตัวอย่างแผนกผมละกัน โลหะหนักครับ วิเคราะห์แร่ธาตุต่างๆฟอร์มที่ผมออกแบบให้หน่วยงานเป็นดังรูปครับ
จากนั้นผมจะเ อาแต่ละไฟล์รวมรวมใน Datagrid
พอออกมาเป็น datagrid จะเป็นแบบนี้ครับ
ความจริงผมอยากจะใช้ Access แต่ว่าใช้แล้วงานไม่เวิร์กเพราะผมต้องใช้สูตรคุบแต่ละเซลล์เยอะครับ
ก็เลยต้องจำทนใช้ Excel ต่อไป
Date :
2014-09-05 09:40:02
By :
lamaka.tor
ได้แระครับช้ากว่าเดิมนิดนึงแต่ก็ต้องทำไปก่อนเพราะงานต้องออกทำวัน
ใครมีแนวคิดดีๆแนะนำได้อีกนะครับ
ผมต้องการให้โปรแกรมออกมาดีที่สุดคนใช้งานง่ายครับ
Code (C#)
private void RefreshData()
{
Cursor = Cursors.WaitCursor;
List<string> _file = new List<string>();
_file = TORServices.clsFile_Path.GetFilesRecursive(@"E:\REPORT", "*.Report");///@"H:\REPORT"
if (_file.Count <= 0) { Cursor = Cursors.Default; return; }
if (dt != null) { dt = null; }
dt = new DataTable();
dt.Columns.Add(new DataColumn("SampleID",typeof(string)));
dt.Columns.Add(new DataColumn("Parameter", typeof(string)));
dt.Columns.Add(new DataColumn("Value", typeof(string)));
dt.Columns.Add(new DataColumn("Date", typeof(string)));
dt.Columns.Add(new DataColumn("ผู้วิเคราะห์", typeof(string)));
dt.Columns.Add(new DataColumn("Seleced", typeof(Boolean)));
string FileExcel;
foreach(string _f in _file)
{
//เช็คการเปิดไฟล์ถ้าเปิดให้ก๊อบไปวางที่ Temp
if (!(TORServices.clsFile_Path.IsFileExcelOpen(_f)))
{
FileExcel = System.IO.Path.GetTempPath() + String.Format("{0:ddMMyyyy HHmmss}", DateTime.Now) + ".Report";
System.IO.File.Copy(_f, FileExcel);
}
else
{
FileExcel = _f;
}
// FileExcel = _f;
dgvmgKg.DataSource = GetTable("SELECT * FROM `mg_Kg$Print_Area`", FileExcel).DefaultView;
dgvmgL.DataSource = GetTable("SELECT * FROM `mg_L$Print_Area`", FileExcel).DefaultView;
for (int i = 0; i < this.dgvmgL.RowCount - 1; i++)
{
if (this.dgvmgL[this.dgvmgL.ColumnCount - 1, i].Value.ToString().Trim().Length != 0)
{
DataRow dr = dt.NewRow();
dr["SampleID"] = this.dgvmgL[this.dgvmgL.ColumnCount - 6, i].Value.ToString().Trim();
dr["Parameter"] = this.dgvmgL[this.dgvmgL.ColumnCount - 5, i].Value.ToString().Trim();
dr["Value"] = this.dgvmgL[this.dgvmgL.ColumnCount - 4, i].Value.ToString().Trim();
dr["Date"] = this.dgvmgL[this.dgvmgL.ColumnCount - 3, i].Value.ToString().Trim();
dr["ผู้วิเคราะห์"] = this.dgvmgL[this.dgvmgL.ColumnCount - 2, i].Value.ToString().Trim();
dr["Seleced"] = false;
dt.Rows.Add(dr);
}
}
for (int i = 0; i < this.dgvmgKg.RowCount - 1; i++)
{
if (this.dgvmgKg[this.dgvmgKg.ColumnCount - 1, i].Value.ToString().Trim().Length != 0)
{
DataRow dr = dt.NewRow();
dr["SampleID"] = this.dgvmgKg[this.dgvmgKg.ColumnCount - 6, i].Value.ToString().Trim();
dr["Parameter"] = this.dgvmgKg[this.dgvmgKg.ColumnCount - 5, i].Value.ToString().Trim();
dr["Value"] = this.dgvmgKg[this.dgvmgKg.ColumnCount - 4, i].Value.ToString().Trim();
dr["Date"] = this.dgvmgKg[this.dgvmgKg.ColumnCount - 3, i].Value.ToString().Trim();
dr["ผู้วิเคราะห์"] = this.dgvmgKg[this.dgvmgKg.ColumnCount - 2, i].Value.ToString().Trim();
dr["Seleced"] = false;
dt.Rows.Add(dr);
}
}
}
dataGridView1.DataSource =dt ;
dataGridView1.Columns[3].Width = 120;
dataGridView1.Columns[4].Width = 150;
dataGridView1.Columns[5].Width = 60;
dataGridView1.Sort(dataGridView1.Columns[0], ListSortDirection.Ascending);
Cursor = Cursors.Default;
}
private System.Data.DataTable GetTable(string _SQL, string FileExcel)
{
string _ConnectionString = @"Data Source=" + FileExcel + "; Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;";
System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(_ConnectionString);
conn.Open();
string strQuery = _SQL;
System.Data.OleDb.OleDbDataAdapter adapter = new System.Data.OleDb.OleDbDataAdapter(strQuery, conn);
System.Data.DataSet ds = new System.Data.DataSet();
adapter.Fill(ds);
return ds.Tables[0];
}
public static bool IsFileExcelOpen(string FileName)
{
try
{
Stream s = File.Open(FileName, FileMode.Open, FileAccess.Read, FileShare.None);
s.Close();
return true;
}
catch (Exception)
{
return false;
}
}
Date :
2014-09-05 10:29:52
By :
lamaka.tor
นางสาวสมศรี เปิดไฟล์ xxx.xls/xxx.xlsx/etc file. แบบ Exclusive แล้วเราไม่สามารถเปิดไฟล์เพื่อ อ่าน/เขียน/etc
--- อันนี้คือข้ออ้างของคนบางเท่านั้น (อย่าว่าแต่ไฟล์ Excel เลย .MDF/.MDB/.ACCDB/.ORACLE ก็ได้
--- เราสามารถเขียนทับ/ให้นางสาวสมศรีเห็น โดยที่ไม่ต้องถามนางสาวสมศรี สักคำ ก็ยังได้เลยครับ
--- (สมศรี พิมพ์ ABC ---> SAVE --> นางสาวสมศรีงง ว่า ข้อความนี้มาได้อย่างไร ---> ABCไปทานอะไรอร่อยอร่อยลิ้นกันสักมื้อไหมครับ)
--- (มันยังทำได้เลยครับ)
Date :
2014-09-05 12:16:26
By :
หน้าฮี
อันนี้แนะให้ครับ (ในเบื้องต้น)
Monitor Shared Folder อทิเช่น
\Center
...\DepartmentA\file*.*
...\DepartmentB\file*.*
...
...
แค่นี้ก็ได้แล้วครับ 500 GB/>ล้านไฟล์ มันยังน้อยไปครับ
ปล. เผื่อมองภาพไม่ออกอีก (ทั้งผจก/หน แผนก/ลูกน้อง) ดักจับเฉพาะไฟล์ที่มีการเปลียนแปลงไฟล์เดิม/เพิ่มไฟล์ใหม่/ลบไฟล์เดิมทิ้ง
วันวันหนึ่งมันจะสักกี่ไฟล์กันเชียวครับ (ต่อให้เลิกงานแล้วยังไม่ยอมกลับบ้าน[ขยัน]) ให้เลยครับ 1,000 ไฟล์ รวมทุกฝ่าย/แผนก
--- เราสามารถเขียนทับ/ให้นางสาวสมศรีเห็น โดยที่ไม่ต้องถามนางสาวสมศรี สักคำ ก็ยังได้เลยครับ
------- อันนี้เคยบอกไปแล้วในที่นี้ 2> ครั้งได้ (ถ้าผมจำไม่ผิด) หาเอาเองก็แล้วกันครับ
ประวัติการแก้ไข 2014-09-05 12:22:50 2014-09-05 12:24:53 2014-09-05 12:26:23
Date :
2014-09-05 12:20:35
By :
หน้าฮี
พี่เค้าเป็นงี้แหละครับอย่าถือแกเลย
Date :
2014-09-06 17:22:49
By :
lamaka.tor
ขออภัยด้วยครับผมสมาชิกใหม่ เลยไม่ค่อยรู้เรื่องนิสัยกับใครเท่าไรครับ ต้องขออภัยด้วยครับ ที่ถามไปแบบนั้น
ประวัติการแก้ไข 2014-09-06 17:50:49
Date :
2014-09-06 17:48:53
By :
zarooman
สวัสดีพี่เจ้าของกระทู้คะรบกวนพี่ช่วยสอนหน่อยได้ไหมคะ ว่าเราจะสามารถเลือก คอลัมน์ หรือแถวบางแถว ใน excel มาลง Datagridview ได้อย่างไงบ้าง ขอบคุณคะ
Date :
2015-09-21 10:59:51
By :
Preeyapan
Load balance : Server 01