• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Lập trình Microsoft Office Excel

Các bài viết hướng dẫn về Visual Basic .NET và C#

Điều hành viên: tungcan5diop, QUANITGROBEST

Hình đại diện của người dùng
Bacrua
Thành viên chính thức
Thành viên chính thức
Bài viết: 17
Ngày tham gia: T.Sáu 24/07/2009 10:40 am
Đến từ: VNUH & KAIST
Liên hệ:

Re: Lập trình Microsoft Office Excel

Gửi bàigửi bởi Bacrua » T.Hai 07/09/2009 4:25 pm

Cho mình hỏi chút! Mình cũng đang xử lý Excel bằng C#, để tính toán giữa hai thời gian khác nhau.
"Giờ vào lớp", và "Giờ về" được lưu trong một DGview. Sau đó, xuất DGview này ra file Excel. Rồi tính cột còn lại
" Thời gian học".
Hình ảnh


--> Để tính toán trong Excel, ta chỉ việc chèn công thức tính vào ô kết quả nhờ thuộc tính Formula của Range được chọn.
Code cho câu hỏi trên:

Mã: Chọn hết

  1. ExcelApp.CalculateFull();
  2. ExcelApp.get_Range("C5", "C" + DGView1.Rows.Count).Formula = "=TEXT(B5-A5,\"hh:mm:ss\")";
  3. ExcelApp.get_Range("C5", "C" + DGView1.Rows.Count).Calculate();


Delfy
Mechatronics Department, Coltech, VNUH.
Webblog:http://delfycoltech.no1.vn

Hình đại diện của người dùng
Bacrua
Thành viên chính thức
Thành viên chính thức
Bài viết: 17
Ngày tham gia: T.Sáu 24/07/2009 10:40 am
Đến từ: VNUH & KAIST
Liên hệ:

Re: Lập trình Microsoft Office Excel

Gửi bàigửi bởi Bacrua » T.Hai 07/09/2009 4:47 pm

Hi Đạt, Dữ liệu của tớ từ DGView được xuất ra file Excel có dạng sau:

Hình ảnh

Bây giờ tớ muốn viết câu lệnh duyệt sao cho cứ sau 3 dòng dữ liệu có cột Họ tên giống nhau. Excel tự động chèn vào một Row trống.( Mục đích của Tớ là để tính tổng điểm thi của 3 môn trong dòng đó).
Tớ đã dùng vòng for để thực hiện và thuộc tính Insert của Range mà vẫn chưa được. :-?
Đạt xem hộ code và cho ý kiến giúp Tớ nhé! Thanks alot! ;)

Mã: Chọn hết

  1.   int n = 1;
  2.             bool x = false;
  3.             for (int i = 0; i < ExcelSheet.UsedRange.Rows.Count; i++)
  4.             {
  5.                 if (ExcelSheet.UsedRange.Cells[i + 2, 2] == ExcelSheet.UsedRange.Cells[i + 3, 3])
  6.                 {
  7.                     x = true;
  8.                     n = n + n * i;
  9.                 }
  10.             }
  11.             if (x == false)
  12.             {
  13.                 ExcelApp.get_Range("A" + n, "C" + n).Insert(Microsoft.Office.Interop.Excel.XlInsertShiftDirection.xlShiftDown, Type.Missing);
  14.             }
Delfy
Mechatronics Department, Coltech, VNUH.
Webblog:http://delfycoltech.no1.vn

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: Lập trình Microsoft Office Excel

Gửi bàigửi bởi vo_minhdat2007 » T.Hai 07/09/2009 6:45 pm

Mình không biết trong DataGridview dữ liệu của bạn là dạng dòng (hệt như bảng tính trên), hay là mỗi tên một dòng (với 3 cột). Nhưng nói chung cách giải quyết không khác nhau mấy.

Theo mình bạn nên xử lí ngay lúc xuất dữ liệu, thay vì chèn dòng sau khi đã xuất như code trên. Mình chưa test xem nó đúng hay sai.

  • Nếu dữ liệu của bạn là mỗi tên một dòng thì khá dễ dàng rồi, nếu muốn đơn giản thay vì dùng biến lặp (i) thì bạn tạo một biến đếm là j chỉ số dòng đang xuất, mỗi vòng lặp trong (vòng lặp duyệt từng cột trong dgv) tăng j lên 1, còn vòng lặp ngoài (duyệt từng hàng trong dgv) cũng tăng thêm 1. Còn muốn dùng luôn i (1 + (i*2)) thì cũng được, nhưng sau này phát triển coi chừng số 1 :P.
  • Nếu dữ liệu của bạn hệt như trong Excel trên hình thì cũng tương tự, đặt một biến j nếu muốn (xét nếu i Mod 3 = 0 thì j+=2, còn <> 0 thì j+=1). Còn xét theo i thì bạn có thể nghiên cứu, theo mình thì hơi "mệt".

Hi vọng đúng ý bạn :)

Hình đại diện của người dùng
Bacrua
Thành viên chính thức
Thành viên chính thức
Bài viết: 17
Ngày tham gia: T.Sáu 24/07/2009 10:40 am
Đến từ: VNUH & KAIST
Liên hệ:

Re: Lập trình Microsoft Office Excel

Gửi bàigửi bởi Bacrua » T.Hai 07/09/2009 10:00 pm

Rất cảm ơn Đạt vì câu trả lời nhanh chóng cho mình!
Đúng là dữ liệu trong DGView của mình không phải như trong file Excel gửi kèm. Mà là sắp xếp lộn xộn. Ý định của mình cũng giống gợi ý của bạn là chèn dòng ngay khi xuất. Nhưng mà sau khi Sort theo tên (Do vậy mới có dạng như hình minh họa).

Mình sẽ thử theo gợi ý của Đạt. Nhưng mình xin đính chính lại là cái hình gửi kèm chỉ là minh họa cho việc chèn thêm một dòng vào dưới mỗi vùng dữ liệu giống nhau. Trong thực tế của mình làm là lớn hơn 3 và tùy từng trường hợp chứ không fix một giá trị dòng nào cả (Có thể là 20, 30,...)!
Delfy
Mechatronics Department, Coltech, VNUH.
Webblog:http://delfycoltech.no1.vn

ngochan011290
Bài viết: 5
Ngày tham gia: T.Tư 14/04/2010 10:31 pm

Re: Lập trình Microsoft Office Excel

Gửi bàigửi bởi ngochan011290 » T.Tư 14/04/2010 10:34 pm

TUT này hay quá nhưng 1 số hình demo bị mất link rùi, chủ topic có thể fix lại ko vậy?? thanks [-O<

Hình đại diện của người dùng
xuanquy_th
Guru
Guru
Bài viết: 792
Ngày tham gia: T.Ba 05/08/2008 9:15 pm
Đến từ: Thanh Hoá
Has thanked: 1 time
Been thanked: 10 time
Liên hệ:

Re: Lập trình Microsoft Office Excel

Gửi bàigửi bởi xuanquy_th » T.Tư 14/04/2010 11:36 pm

vo_minhdat2007 đã viết:
Bacrua đã viết:Bây giờ gặp trường hợp xuất dữ liệu thêm vào một file Excel có sẵn thì làm thế nào nhỉ??? :-?

Tuỳ bạn? Dùng UsedRange xác định dòng cuối cùng, rồi cộng 1 vào thôi!

xuanquy_th đã viết:

Mã: Chọn hết

                Dim fc As New System.Globalization.CultureInfo("vi-VN", True)        System.Threading.Thread.CurrentThread.CurrentCulture = fc        System.Threading.Thread.CurrentThread.CurrentUICulture = fc        Dim App As New Application        Dim mPath As String = App.DefaultFilePath '<<== Error(Old format or invalid type library. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))) 'Xin chỉ giùm cách khắc phục xự cố để có thể dùng được định dạng CultureInfo("vi-VN", True)


Mã: Chọn hết

        Dim App As New Application        App.Visible = True        App.UserControl = True        Dim oldCI As System.Globalization.CultureInfo = _            System.Threading.Thread.CurrentThread.CurrentCulture        Dim fc As New System.Globalization.CultureInfo("vi-VN", True)        System.Threading.Thread.CurrentThread.CurrentCulture = fc        System.Threading.Thread.CurrentThread.CurrentUICulture = fc        Dim mPath As String = App.DefaultFilePath        MsgBox(mPath)        System.Threading.Thread.CurrentThread.CurrentCulture = oldCI


Kết quả =D>
untitled.JPG


Làm vậy thì số liệu chỉ có đứt sau khi chuyển mà không hợp định dang số với Computer
À mà sao test code của xuanquy đâu có bị lỗi?

đảo lại định dạng số của máy rồi test lại đoạn lện đó xem
Khi Chúa Trời đóng cánh cửa này lại, Ngài sẽ mở một cánh cửa khác cho ta.
Nhưng ta thường nhìn quá lâu vào cánh cửa đã đóng nên không thấy được có một cánh cửa khác đang mở ra cho ta!!!

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: Lập trình Microsoft Office Excel

Gửi bàigửi bởi vo_minhdat2007 » T.Năm 15/04/2010 5:49 pm

ngochan011290 đã viết:TUT này hay quá nhưng 1 số hình demo bị mất link rùi, chủ topic có thể fix lại ko vậy?? thanks [-O<


Cám ơn bạn, đã sửa ;)

Hình đại diện của người dùng
Bacrua
Thành viên chính thức
Thành viên chính thức
Bài viết: 17
Ngày tham gia: T.Sáu 24/07/2009 10:40 am
Đến từ: VNUH & KAIST
Liên hệ:

Re: Lập trình Microsoft Office Excel

Gửi bàigửi bởi Bacrua » T.Năm 06/05/2010 6:44 pm

Hi hi hi! Lâu rùi lại quay lại forum. Giao diện mới thay đổi thì phải. Nhưng mình vẫn thích màu xanh lơ kia hơn! :)

Mình mới được giao làm phần mềm chấm công sử dụng thẻ RFID. (Đầu đọc thẻ công ty mình đã mua của Đài Loan.)
- Đầu đọc sẽ gửi dữ liệu mã thẻ lên máy tính qua cáp cổng COM.
- Mình phải lập trình phần mềm để lưu lại thông tin vào/ra của nhân viên đồng thời lưu lại thời gian họ quét thẻ.

Việc nhận dữ liệu mã thẻ, lưu thời gian, tính toán giờ làm của nhân viên đã OK.

Mình đang gặp vấn đề trong việc xuất ra các báo cáo theo ngày, tháng của CSDL đã lưu được đó.

1. Phương án 1: Mình định dùng Crystal Report để xuất ra các báo cáo. Nhưng nó khó hiểu wa'! :-?

2. Phương án 2: Mình sẽ xuất ra Excel và tính toán thời gian làm việc luôn cho tiện.

Vậy làm thế nào để xuất một vùng dữ liệu ra Excel? Giả sử bảng dữ liệu (DGView) của mình gồm 30 ngày. Mình chỉ muốn xuất 1 ngày nào đó thì xử lý thế nào?

Theo các bạn phương án 1 hay 2 hiệu quả hơn? :-/

Cảm ơn ACE!
Delfy
Mechatronics Department, Coltech, VNUH.
Webblog:http://delfycoltech.no1.vn

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: Lập trình Microsoft Office Excel

Gửi bàigửi bởi vo_minhdat2007 » T.Sáu 07/05/2010 9:38 pm

Cái này tuỳ bạn thôi, thường người ta dùng Report, nhưng Excel cũng không phải không có cách. Có điều mình chưa hiểu dữ liệu của bạn thế nào mà bạn gặp khó khăn khi xuất ra Excel? Bạn cho 1 dữ liệu mẫu xem!

Hình đại diện của người dùng
Bacrua
Thành viên chính thức
Thành viên chính thức
Bài viết: 17
Ngày tham gia: T.Sáu 24/07/2009 10:40 am
Đến từ: VNUH & KAIST
Liên hệ:

Re: Lập trình Microsoft Office Excel

Gửi bàigửi bởi Bacrua » T.Bảy 08/05/2010 12:40 am

Uh cảm ơn Đạt!
Tớ đã xuất được vùng dữ liệu theo ngày ra excel rồi.
Nhưng có một vấn đề gặp phải là.
Xuất ra sheet[1] thì OK, nhưng ra các sheet[2], 3,...n thì báo lỗi!
Invalid index. (Exception from HRESULT: 0x8002000B (DISP_E_BADINDEX))

Không hiểu sao vậy Đạt nhỉ?
Delfy
Mechatronics Department, Coltech, VNUH.
Webblog:http://delfycoltech.no1.vn

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: Lập trình Microsoft Office Excel

Gửi bàigửi bởi vo_minhdat2007 » T.Bảy 08/05/2010 8:46 am

Mình Google thì thấy lỗi đó là OutOfRange (tràn). Có thể cái workbook chỉ có 1 sheet mà bạn gọi 2, 3, ... thì nó lỗi? Bạn xem lại cái SheetsInNewWorkbook là bao nhiêu?

  1.         'Gọi một chương trình Excel
  2.         Dim App As New Application
  3.         'Hiện Excel lên, bỏ dòng này nếu muốn chạy ẩn
  4.         App.Visible = True
  5.         'Khi khởi tạo 1 Workbook, sẽ tạo 1 worksheet
  6.         App.SheetsInNewWorkbook = 3
  7.         'Tạo một Workbook và quản lí bằng biến WBook
  8.         '(Workbook là 1 cửa sổ Excel, Worksheet là 1 trang)
  9.         Dim WBook As Workbook = App.Workbooks.Add
  10.         'Tạo một Worksheet và quản lí bằng biến WSheet
  11.         Dim WSheet As Worksheet = WBook.Worksheets(1)
  12.         WSheet.Range("A1").Value = "WSheet 1"
  13.         WSheet = WBook.Worksheets.Item(2)
  14.         WSheet.Range("A1").Value = "WSheet 2"

Hình đại diện của người dùng
Bacrua
Thành viên chính thức
Thành viên chính thức
Bài viết: 17
Ngày tham gia: T.Sáu 24/07/2009 10:40 am
Đến từ: VNUH & KAIST
Liên hệ:

Re: Lập trình Microsoft Office Excel

Gửi bàigửi bởi Bacrua » T.Bảy 08/05/2010 9:19 am

OK, thanks!
Mình đã solve được vấn đề từ đêm qua.
Đúng là Workbook ban đầu mình tạo có mỗi một sheet! :)
Do vậy xảy ra lỗi trên vì có chỗ đâu mà đổ dữ liệu vào. :-P
Mình đã khắc phục bằng cách tạo ra hẳn một fiel Excel mẫu theo ý của mình.
Và chỉ việc xuất dữ liệu vào đó.
Nhưng cũng cảm ơn Đạt vì cái SheetsInNewWorkbook. Bi giờ mới bi't!
Delfy
Mechatronics Department, Coltech, VNUH.
Webblog:http://delfycoltech.no1.vn

minhtan2201
Thành viên chính thức
Thành viên chính thức
Bài viết: 15
Ngày tham gia: CN 20/09/2009 10:07 am

Re: Lập trình Microsoft Office Excel

Gửi bàigửi bởi minhtan2201 » T.Ba 29/06/2010 12:20 pm

Nhân tiện cho mình hỏi,
Làm thế nào để insert dữ liệu vào file excel mẫu mà phía dưới đã có dữ liệu. Mình đọc tut của bạn thì thấy các câu lệnh trên chỉ chèn được khi phía dưới nó không có dữ liệu. Bạn giúp mình nhé.

Mình viết bằng VB.NET và thêm dữ liệu vào file excel mẫu của phần mềm HTKK thuế đó, giả dụ là file thuegtgtdauvao.xls

HaiPT
VIP
VIP
Bài viết: 252
Ngày tham gia: T.Tư 07/09/2005 4:02 pm
Đến từ: Hải Phòng
Has thanked: 1 time
Been thanked: 12 time
Liên hệ:

Re: Lập trình Microsoft Office Excel

Gửi bàigửi bởi HaiPT » T.Ba 29/06/2010 1:54 pm

Cách này có nhược điểm là code khá phức tạp dài dòng , nếu bản chỉ cần thao tác với file excel ở mức : têm , sửa, xóa,load.. thì dùng ado.net truy xuất đến là xong, nó sẽ coi xls file như 1 cơ sở dữ liệu , mỗi sheet là 1 table ,dong đầu tiền có thể là field name
Vào đây để biết các nguồn dữ liệu mà ado.net hỗ trợ
http://www.connectionstrings.com/
Tuy nhiên nếu bạn muốn thao tác xls ở mức chỉnh sửa màu sẵc,thêm chart.. thì dùng cách đầu
Phạm Hải
Quản trị dự án ,Chuyên gia đào tạo
Đại học FPT

minhtan2201
Thành viên chính thức
Thành viên chính thức
Bài viết: 15
Ngày tham gia: CN 20/09/2009 10:07 am

Re: Lập trình Microsoft Office Excel

Gửi bàigửi bởi minhtan2201 » T.Năm 01/07/2010 7:59 am

minhtan2201 đã viết:Làm thế nào để insert dữ liệu vào file excel mẫu mà phía dưới đã có dữ liệu. Mình đọc tut của bạn thì thấy các câu lệnh trên chỉ chèn được khi phía dưới nó không có dữ liệu. Bạn giúp mình nhé.

Mình viết bằng VB.NET và thêm dữ liệu vào file excel mẫu của phần mềm HTKK thuế đó, giả dụ là file thuegtgtdauvao.xls

bác vo_minhdat2007 hay ai đó giúp hộ mình câu hỏi này với :((

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: Lập trình Microsoft Office Excel

Gửi bàigửi bởi vo_minhdat2007 » T.Năm 01/07/2010 9:35 am

Thì như anh HaiPT đã nói rồi đấy thôi, còn nếu làm như TUT thì nạp trước, rồi chèn vào mảng, sau đó lại đưa trở ra Excel.

tinhyeudep
Bài viết: 5
Ngày tham gia: T.Năm 29/01/2009 4:00 pm

Re: Lập trình Microsoft Office Excel

Gửi bàigửi bởi tinhyeudep » CN 04/07/2010 9:09 am

Bài viết này hay quá; anh em nào biết làm ebook thì tập hợp lại đóng thành ebook cho tớ và mọi người học tập với. thanks! ;)

khoitran
Bài viết: 1
Ngày tham gia: T.Bảy 17/07/2010 1:54 pm

Re: Lập trình Microsoft Office Excel

Gửi bàigửi bởi khoitran » T.Bảy 17/07/2010 2:49 pm

  1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  2.         'Gọi một chương trình EXCEL
  3.         Dim App As New Application
  4.         'Hiện chương trình
  5.         App.Visible = True
  6.         'Gọi WBook là biến quản lí workbook tạo bằng cách
  7.         'mở tập tin Input.xls trong thư mục My Document
  8.         Dim WBook As Workbook = App.Workbooks.Open( _
  9.             My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\Input.xlsx")
  10.         'Gọi WSheet là biến quản lí worksheet đầu tiên trong WBook.
  11.         'Ngoài ra có thể quản lí theo tên của worksheets
  12.         'bằng cách thay 1 ở code bên dưới thành tên worksheet.
  13.         Dim WSheet As Worksheet = WBook.Worksheets(1)
  14.         'Gán các giá trị
  15.         For i As Integer = 0 To dgvData.RowCount - 2
  16.             WSheet.Range("A" & i + 3).Value = i + 1
  17.             WSheet.Range("B" & i + 3).Value = dgvData.Rows(i).Cells(0).Value
  18.             WSheet.Range("C" & i + 3).Value = dgvData.Rows(i).Cells(1).Value
  19.         Next
  20.         Dim OutputPath As String = _
  21.             My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\Output.xlsx"
  22.         'Trước khi lưu, hãy xoá tập tin nếu có
  23.         'để Excel không hỏi người dùng khi ghi đè
  24.         If IO.File.Exists(OutputPath) Then _
  25.             IO.File.Delete(OutputPath)
  26.         'Lưu thành tập tin Output.xlsx cũng trong My Document
  27.         WBook.SaveAs(OutputPath)
  28.         'Nếu muốn lưu thành cùng tên thì bạn chỉ cần dùng code sau :
  29.         'WBook.Save()
  30.     End Sub

cho mình hỏi là bạn dùng VS mấy, office mấy. Mình dùng VS 2008 office 2007 thì ko thấy có cái lớp Application như bạn dùng. Và phương thức open của workbook cũng có rất nhiều tham số chứ ko phải chỉ có mỗi cái đường dẫn như bạn dùng. Như vậy là sao nhỉ :(

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: Lập trình Microsoft Office Excel

Gửi bàigửi bởi vo_minhdat2007 » T.Bảy 17/07/2010 5:32 pm

Đã Import cái Namespace của Excel vào chưa?

nokia6230ivn
Thành viên chính thức
Thành viên chính thức
Bài viết: 32
Ngày tham gia: T.Bảy 20/02/2010 2:18 am

Re: Lập trình Microsoft Office Excel

Gửi bàigửi bởi nokia6230ivn » T.Ba 24/08/2010 3:36 pm

Nhờ các bạn xem giúp error này với!
Trước khi có Imports Microsoft.Office.Interop.Excel thì soft vẫn chạy bthường. Khi đưa vô thì xuất hiện lổi 'DataTable' is ambiguous, imported from the namespaces or types 'Microsoft.Office.Interop.Excel, System.Data'.
(hình đính kèm)
Thế này thì sửa thế nào í nhỉ???
Sao không thấy nút THANKS


Quay về “[.NET] Bài viết hướng dẫn”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách