Ở bài viết này, Góc Kinh Nghiệm hướng dẫn bạn cách đọc dữ liệu tập tin excel, sau đó import dữ liệu đọc được vào database.
Ở đây Góc Kinh Nghiệm sử dụng:
- Microsoft Excel 2003
- SQL Server 2005
- Visual Studio 2010 (Win Form)
Mô tả:
Người dùng nhất vào nút “Browse …” để chọn tập tin excel cần import. Kế tiếp nhấn nút “Import excel” để thực thiện việc import dữ liệu vào database. Sau khi kết thúc import xong, lấy tất cả dữ liệu từ dabase hiển thị lên DataGridView, kết quả như hình bên dưới:
Hình 1: Giao diện form import excel
Giờ chúng ta cùng Góc Kinh Nghiệm lần lượt làm theo các bước sau:
- Bước 1: Tạo tập tin import tên EmployeeInfo.xls có thông tin và định dạnh như hình bên dưới:
Hình 2: thông tin và định dạng tập tin excel cần import
- Bước 2: Vào SQL Server 2005 tạo cơ sở dữ liệu có tên HumanResourceDB và table có tên EmployeeInfo như hình bên dưới:
Hình 3: Database để lưu thông tin import
Lưu ý: ở đây bạn cũng có thể dụng SQL Server 2000 để thao tác (không nhất thiết là SQL Server 2005)
- Bước 3: Mở Visual Studial 2010 (bạn cũng có thể dùng VS2005, VS2008 để thao tác), Vào File -> New -> Project … -> Windows (phía bên trái) -> Windows Forms Application, và gõ vào ô Name bên tên project là ImportExcel
- Bước 4: Sau khi project được tạo, bạn đổi tên Form1 thành FormMain, vào design của FormMain tạo các đối tượng sau:
- TextBox: tên txtFilePath, dùng để chứa đường dẫn tập tin excel cần import
- Button: tên btnBrowse, cho phép người dùng chọn tập tin excel cần import
- Button: tên btnImportExcel, thực hiện import khi người dùng nhấn vào nút này, sau khi import thành công sẽ hiển thị dữ liệu lên DataGridView
- DataGridView: tên dgvData, để chứa dữ liệu được lấy từ database sau khi import xong
- Lable “File Path” tùy ý
Tham khảo hình 1 ở trên
- Bước 5: Nhất chuột phải lên project ImportExcel -> Add -> New Item .. -> Data (bên trái) -> DataSet (bên phải), gõ tên HumanResource.xsd vào ô Name như hình bên dưới
Hình 4: Tạo DataSet tên HummanResource.xsd
- Bước 6: Nhấn chuột phải vào vào DataSet vừa tạo ở bước 5, chọn Add -> TableAdapter …, hiện ra một hộp thoại TableAdapter Cofiguration Wizard -> nhấn nút New Connection …, -> xuất hiện hộp thoại tên Add Connection, gõ dấu chấm (.) vào ô Server Name (dấu chấm ở đây đại diện cho localhost, tức SQL Server đang được cài trên máy hiện hành của bạn), và chọn database tên “HumanResourceDB” (database này đã tạo sẵn ở bước 2) -> nhấn nút OK -> nhất Next, và làm theo chỉ dẫn của wizard, xem hình bên dưới:
Hình 5: tạo kết nối với database
Sau khi hoàn tất Wizard, chúng ta được DataSet với kết quả hình như sau:
Hình 6: kết quả của DataSet được tạo
Trong đó:
Nội dung các hàm lần lược như sau:
GetData()
SELECT [Index], Code, FullName, WorkingYears FROM EmployeeInfo
GetEmployeeInfoByCode()
SELECT [Index], Code, FullName, WorkingYears FROM EmployeeInfo Where Code = @Code
InsertEmployee()
INSERT INTO [EmployeeInfo] ([Code], [FullName], [WorkingYears]) VALUES (@Code, @FullName, @WorkingYears); SELECT SCOPE_IDENTITY()
UpdateEmployeeInfoByCode()
UPDATE EmployeeInfo SET FullName = @FullName, WorkingYears = @WorkingYears WHERE (Code = @Original_Code);
- Bước 7: quay lại form FormMain, code như bên dưới:
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.Data.OleDb; namespace ImportExcel { public partial class FormMain : Form { public FormMain() { InitializeComponent(); btnBrowse.Click += new EventHandler(btnBrowse_Click); btnImportExcel.Click += new EventHandler(btnImportExcel_Click); } void btnBrowse_Click(object sender, EventArgs e) { // Browse đến file cần import OpenFileDialog ofd = new OpenFileDialog(); // Lấy đường dẫn file import vừa chọn txtFilePath.Text = ofd.ShowDialog() == DialogResult.OK ? ofd.FileName : ""; } void btnImportExcel_Click(object sender, EventArgs e) { if (!ValidInput()) return; // Đọc dữ liệu từ tập tin excel trả về DataTable DataTable data = ReadDataFromExcelFile(); // Import dữ liệu đọc được vào database ImportIntoDatabase(data); // Lấy hết dữ liệu import từ database hiển thị lên gridView ShowData(); } private bool ValidInput() { if (txtFilePath.Text.Trim() == "") { MessageBox.Show("Xin vui lòng chọn tập tin excel cần import"); return false; } return true; } private DataTable ReadDataFromExcelFile() { string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + txtFilePath.Text.Trim() + ";Extended Properties=Excel 8.0"; // Tạo đối tượng kết nối OleDbConnection oledbConn = new OleDbConnection(connectionString); DataTable data = null; try { // Mở kết nối oledbConn.Open(); // Tạo đối tượng OleDBCommand và query data từ sheet có tên "Sheet1" OleDbCommand cmd = new OleDbCommand("SELECT * FROM [Sheet1$]", oledbConn); // Tạo đối tượng OleDbDataAdapter để thực thi việc query lấy dữ liệu từ tập tin excel OleDbDataAdapter oleda = new OleDbDataAdapter(); oleda.SelectCommand = cmd; // Tạo đối tượng DataSet để hứng dữ liệu từ tập tin excel DataSet ds = new DataSet(); // Đổ đữ liệu từ tập excel vào DataSet oleda.Fill(ds); data = ds.Tables[0]; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } finally { // Đóng chuỗi kết nối oledbConn.Close(); } return data; } private void ImportIntoDatabase(DataTable data) { if (data == null || data.Rows.Count == 0) { MessageBox.Show("Không có dữ liệu để import"); return; } HumanResourceTableAdapters.EmployeeInfoTableAdapter adapter = new HumanResourceTableAdapters.EmployeeInfoTableAdapter(); string code = "", fullName = ""; int workingYears = 0; try { for (int i = 0; i < data.Rows.Count; i++) { code = data.Rows[i]["Code"].ToString().Trim(); fullName = data.Rows[i]["FullName"].ToString().Trim(); workingYears = int.Parse(data.Rows[i]["WorkingYears"].ToString().Trim()); HumanResource.EmployeeInfoDataTable existingEmployee = adapter.GetEmployeeInfoByCode(code); // Nếu nhân viên chưa tồn tại trong DB thì thêm mới if (existingEmployee == null || existingEmployee.Rows.Count == 0) { adapter.InsertEmployee(code, fullName, workingYears); } // Ngược lại, nhân viên đã tồn tại trong DB thì update else { adapter.UpdateEmployeeInfoByCode(fullName, workingYears, code); } } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } MessageBox.Show("Kết thúc import"); } private void ShowData() { HumanResourceTableAdapters.EmployeeInfoTableAdapter adapter = new HumanResourceTableAdapters.EmployeeInfoTableAdapter(); dgvData.DataSource = adapter.GetData(); } } }
Bước 8: Build và chạy chương trình, thu được kết quả như hình 1 bên trên
Góc Kinh Nghiệm chúc các bạn thành công!
Chào Chương trình !
Em muốn hỏi cách ghi dữ liệu từ một Mảng, DataTable ra file .docx
Các anh chị có thể giúp em không ạ?
Em cám ơn các anh chikj
nh chị ơi cho em hỏi cái HumanResourceTableAdapters là lấy ở đâu ra ạ.
Chính là dataset đó bạn!
EmployeeInfoTableAdapter() cai ham nay o dau ra vay ban ? hic
Ở hình 6, khi tạo dataset tên HumanResource, và add một TableAdapter tên EmployeeInfo vào dataset thì sẽ tự động sinh ra EmployeeInfoTableAdapter() tương ứng mặc định, nếu không thích tên mặc định bạn có thể sửa lại tên bất kỳ.
Chào bạn! bạn bao nhiêu tuổi rồi, mình có thể làm bạn được ko?
Mình muốn hỏi bạn, khi xuất dữ liệu ra file Excel thì mình sẽ làm như thế nào???
Bạn chỉ giúp mình đc ko?
Hey!
Cho mình hỏi là trường hợp mình Import 1 file excel mà không phải mặt định là dòng đầu tiên, và các cột không theo 1 thứ tự nào (Ví dụ như mình lấy cột 1,4,5,6,8,9,12,21,23,24,25,27,31,42 trong file excel). Thì mình dùng code nào?
Pls help me!
__
Thanks & Best regards,
Sea Truong
1. Không phải dòng đầu tiên:
Chỗ for (i = 0; …) bạn thay i = vị trí dòng bạn muốn import dữ liệu, lưu ý dòng đầu tiên là vị trị 0 (chứ ko phải 1)
2. Các cột dữ liệu bất kỳ:
Bên trong vòng for có dòng lệnh : data.Rows[i][“Code”], ở đây bạn thay thành data.Rows[i][4], nó có nghĩa là lấy dữ liệu dòng thứ i và của cột 4, tương tự ở đây vị trí cột đầu tiên vẫn bắt đầu là 0
Mình có 1 cách khác cũng được muốn giới thiệu với các bạn
public static ArrayList ImportDataFromExcel(ref int error, string file, string tablename, Type objType)
{
Application exApp = new Application();
Workbook exBook = null;
Sheets oSheetsColl = null;
Worksheet oSheet = null;
Object oMissing = System.Reflection.Missing.Value;
exBook = exApp.Workbooks.Open(file, 0, true, 5, “”, “”, true, XlPlatform.xlWindows, null, null, null, null, null, null, null);
oSheetsColl = exBook.Worksheets;
List tableNames = GetColumnNamesInTable(tablename);
ArrayList list = new ArrayList();
int index = 0;
for (int sheetindex = 1; sheetindex < oSheetsColl.Count + 1; sheetindex++)
{
index++;
oSheet = (Worksheet)oSheetsColl[sheetindex];
int x = 1;//cột
int y = 1;//hàng
string s = oSheet.Name;
error = 0;
while (y <= 20)
{
for (int i = 0; i < 19; i++)
{
Range range = (Range)oSheet.Cells[y, x];
if (range.Value2 != null && !string.IsNullOrEmpty(range.Value2.ToString()) && y <= 20)
{
error = 1;
break;
}
else
{
index++;
x++;
}
}
if (error == 1)
break;
y++;
x = 1;
}
if (y <= 20 && error == 1)
{
bool isNull = false;
int k = x;
while (!isNull)
{
object obj = Activator.CreateInstance(objType);
isNull = CheckNullRow(oSheet, tableNames.Count – 1, y, k);
if (isNull == true)
break;
foreach (string namefield in tableNames)
{
if (namefield.ToLower().CompareTo("id") != 0)
{
PropertyInfo propertyInfo = GetPropertyInfo(objType, namefield.ToLower());
if (propertyInfo != null)
{
Range range = (Range)oSheet.Cells[y, k];
if (range.Value2 != null)
{
index++;
CreatObject(obj, propertyInfo, range.Value2.ToString());
}
else
{
break;
}
}
k++;
index++;
}
}
list.Add(obj);
y++;
k = x;
index++;
}
}
}
X.Msg.Alert("Thông báo", "Dữ liệu đã đọc xong", new JFunction()).Show();
// exApp.Visible = true;
return list;
}
bạn nào có demo file web asp.net viết bằng c# vui lòng gửi qua mail. thetruong719@gmail.com cho mình được không. mình đang rất cần mà chưa làm được. cảm ơn trước nha. Thân
bạn ơi co demo tren web form khong cho minh xin voi nhe.maiphucn08a@gmail.com
cam on ban nhieu
Giờ người ta dùng FlexCel nhiều mà giải quyết vấn đề hiệu quả hơn!
Thank you
FlexCel Là gì?
Bạn có thể cho mình link hướng dẩn sử dụng hoặc cài đặt không?
bạn ơi bạn có demo import execl vào data ko bạn có thể chia sẻ cho mình đc không
Flexcel là sự lựa chọn cho làm báo cáo chuyên nghiệp, có thể render ra các định dạng excel , pdf, word, html … , ưu điểm trên nền web là server ko phải cài phần mềm microsoft office mà vẫn thao tác đọc ghi file excel bình thường …
Mình thử làm theo hướng dẫn của bạn có import được nhưng lại bị lỗi font chữ@@. Mình cx ko rõ nguyên nhận, hi vọng đc bạn giúp đỡ. Thanks!
Bạn thêm N’ vào đầu biến trong hàm insert, vì nếu sử dụng font tiếng Việt, tiếp đầu ngữ N’ sẽ giúp chúng ta insert được không bị lỗi font.
bạn ơi cho mình hỏi,mình làm đúng thao tác của bạn,build k bị lỗi, debug, khi mình bấm vào nút Browse nó k hiện ra đường dẫn để chọn.Bạn chỉ giúp mình đi,tks bạn nhiều.
mình dùng sql2008 và visual 2010 mình làm giống hệt các bước hướng dẫn import excel vào database rùi mà cứ bị lỗi ở EmployeeInfoTableAdapter là sao vậy các bạn?
Có nhiều nguyên nhân để gây ra lỗi. Bạn post lỗi lên, để mình tìm nguyên nhân và đưa giải pháp cho bạn
lỗi của bạn Trang chắc cũng giống như tớ bạn à.
Cannot implicitly convert type ‘DemoNhansu.Nhanvien.NHANVIENDataTable’ to ‘DemoNhansu.NhanvienTableAdapters.NHANVIENTableAdapter’ D:\VIECLAM\DemoNhansu\DemoNhansu\frMain.cs
Bạn ơi bạn sửa giúp tớ với nhé.
NhanvienTableAdapters.NHANVIENTableAdapter existingNhanvien = adapter.GetDataByMaNV(MaNV);
và nó bảo lỗi như sau:
Cannot implicitly convert type ‘DemoNhansu.Nhanvien.NHANVIENDataTable’ to ‘DemoNhansu.NhanvienTableAdapters.NHANVIENTableAdapter’ D:\VIECLAM\DemoNhansu\DemoNhansu\frMain.cs
Bạn ơi bạn sửa giúp tớ với nhé.
bạn ơi sao mình làm cái bảng dataset nó không có mấy câu sql giống bạn, nó chỉ có 1 câu fill,getdata() thui ah.
bạn ơi mình làm như hướng dẫn.những trong code có một lỗi như thế này các bạn giúp mình với.Khi chạy dòng lệnh này có lỗi:
HumanResource.EmployeeInfoDataTable existingEmployee = adapter.GetEmployeeInfoByCode(code);
Thông báo:
Error No overload for method ‘GetEmployeeInfoByCode’ takes ‘1’ arguments
Hàm của bạn thiếu tham số
Mình làm giống bài đăng ở trên.vậy tham số thiếu ở đây là gì?bạn có thể giúp mình tìm tham số thiếu đó ko?
Bạn xem thử hàm GetEmployeeInfoByCode bạn mà bạn viết có tham số không
Đã truyền tham số nhưng vẫn không được, bạn hỗ trợ mình với
Mình xin cảm ơn bài viết rất giá trị của bạn. Mình đang rất cần và mình đã sử dụng thành công nó. Nhưng mình chỉ xin nói rằng. Không hiểu nếu để như trên bạn chạy nó có báo lỗi INDEX không. Cái field INDEX bạn đặt làm khóa chính, và nó là 1 field, lúc mình copy nguyên bản program của bạn vào để test thử, khi chạy nó báo lỗi k insert dc field INDEX. Mình vào SQL xóa index vì cơ bản mình cũng k dùng đến nó. Sau đó các hàm trong dataset mình xóa hết index.
Chào bạn
bạn cho mình nhờ chút
sao mình tìm file Excel 2003 import mà sao nó bắt chọ tới 2 lần mới được vào đường dẫn và sao đó import nó báo lỗi như thế này
mong bạn chỉ giúp với
System.Data.OleDb.OleDbException (0x80004005): Could not find installable ISAM at Systen.Data.OleDb.OleDbConnectionInternal.. ctor (OleDbConnectionString constr, OleDbConnection)
at
Systen.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProvideInfo , DBConnectionPool pool, DbConnection owningObject)
System.Data.ProviderBase.DbConnectionClosed.OpenConnection( DbConnection outerConnection , DbConnectionFactory connectionFactory)
at
Systen.Data.OleDb.OleDbConnection.Open()
at
ImportExcel.FormMain.ReadDataFromExcelFile() in D:\visual studio 2010\ImportExcel\ImportExcel\Form.cs : line 66
https://mail.google.com/mail/u/0/?ui=2&ik=c0a6cfda34&view=fimg&th=14c99e56f350e5c0&attid=0.1&disp=inline&realattid=1497902296578654208-local0&safe=1&attbid=ANGjdJ_DMGLZpPPBLTRxNXkXN3qPtVsuVbeT3thTFMAjRn9qfOjMidBHTlmEbbBtXf-SIOLdmcRcIbA45DnB3trjPtSCZ_B85fkr5R-7zpvqLaoio3e9KN9-lcj2Nfw&ats=1428511136253&rm=14c99e56f350e5c0&zw&sz=w912-h514
Cho e hỏi chút ạ !
Thế mỗi lần import bản excel mới thay cho excel cũ thì dataset có tự update ko? hay là lại phải tạo lại dataset ạ ????
Error 1 Cannot implicitly convert type ‘int?’ to ‘ImportExcel.HumanResource.EmployeeInfoDataTable’
minh bi loi nay mong giup do
Error 1 Cannot implicitly convert type ‘int?’ to ‘ImportExcel.HumanResource.EmployeeInfoDataTable’
Các bạn cho hỏi giúp: mình phải nhập dữ liệu thông tin từ file Excel lên webform có sẵn tại website công ty. Nội dung cần nhập liệu là thông tin về học viên và ảnh. Vậy có cách nào để nhập tự động (mình nhập liệu đầy đủ vào file excel) lên web không. Vì số lượng nhập rất nhiều nên nhập bằng tay hay nhầm và mất quá nhiều thời gian. Mong các bạn hỗ trợ. Mình cảm ơn nhiều