• 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
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ệ:

Lập trình Microsoft Office Excel

Gửi bàigửi bởi vo_minhdat2007 » T.Ba 02/06/2009 4:20 pm

Tên bài viết: Lập trình Microsoft Office Excel
Tác giả: Võ Minh Đạt
Cấp độ bài viết: Trung bình
Tóm tắt: Sử dụng VB.NET và C# để làm việc với Excel



Lịch sử :
v1.0 : Bản đầu tiên, đến phần IV.
v1.1 :
- Bổ sung hình ảnh bị thiếu cho phần IV.
- Ngừng hỗ trợ C#.

LẬP TRÌNH MICROSOFT OFFICE EXCEL


Bên cạnh Microsoft Office Word, đa số các dữ liệu thường xuất ra Excel nếu không xuất ra report, và Excel có phần trội hơn hẳn. Hi vọng bài Tut này sẽ giúp bạn làm việc với Excel dễ dàng ;).

I. Cài đặt :
1. Microsoft Office :
Bạn cần phải cài đặt .NET Programmability Support trong phần Microsoft Office Excel.

P1.jpg


2. Chương trình :
Để chương trình sử dụng Microsoft Office Excel, bạn vào Project\Add Reference, qua thẻ COM và chọn 3 reference sau :

P2.jpg


II. Sử dụng :
1. Import Namespace :
Đầu tiên bạn import namespace Excel vào :

Mã: Chọn hết

Imports Microsoft.Office.Interop.Excel


2. Khai báo :

VB.NET

  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 = 1
  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.Add
  12.         'Đừng quên tắt Excel! (nếu chạy ẩn, process của Excel vẫn còn khi thoát chương trình)
  13.         App.Quit


C#

  1. {
  2.     //Gọi một chương trình Excel
  3.     Application App = new Application();
  4.     //Hiện Excel lên, bỏ dòng này nếu muốn chạy ẩn
  5.     App.Visible = true;
  6.     //Khi khởi tạo 1 Workbook, sẽ tạo 1 worksheet
  7.     App.SheetsInNewWorkbook = 1;
  8.     //Tạo một Workbook và quản lí bằng biến WBook
  9.     //(Workbook là 1 cửa sổ Excel, Worksheet là 1 trang)
  10.     Workbook WBook = App.Workbooks.Add;
  11.     //Tạo một Worksheet và quản lí bằng biến WSheet
  12.     Worksheet WSheet = WBook.Worksheets.Add;
  13.     //Đừng quên tắt Excel! (nếu chạy ẩn, process của Excel vẫn còn khi thoát chương trình)
  14.     App.Quit }


To be continued



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.Ba 02/06/2009 5:35 pm

III. Đọc/ghi dữ liệu :
1. Range là gì?
Range, như tên gọi của nó, là 1 vùng trong Worksheet. Vùng có thể là nhiều ô, cũng có thể là 1 ô. Range được khai báo bằng địa chỉ ô đầu và ô cuối nếu có 2 ô trong Range trở lên (tạm gọi là Range lớn – định nghĩa của tác giả), hoặc chỉ đơn giản là địa chỉ 1 ô duy nhất, hay địa chỉ đầu và cuối giống nhau (Range nhỏ).
Địa chỉ ô là gì? Dùng Excel đều biết là một ô (cell) trong Excel đều có 1 địa chỉ dưới dạng XXXxxxxxxx, với XXX là chữ đại diện cho cột và xxxxxxx là số đại diện cho hàng (dòng). Địa chỉ ô tối đa là XFD1048576.

P3.jpg

Cell có địa chỉ XFD1048576

P4.jpg
P4.jpg (23.25 KiB) Đã xem 20450 lần

Range A1:E5

Lưu ý :
+ Địa chỉ ô đầu và cuối có thể hoán đổi cho nhau, Range vẫn không thay đổi.
+ Bất kì Range nào (lớn và nhỏ) đều có range con, định nghĩa range con thực ra không chính xác, vì range con có khả năng vượt qua cả range cha, và range con lớn nhất chính là tất cả cell trong worksheet.

2. Đọc dữ liệu đơn giản :
Ở đây ta sẽ thử mở một cửa sổ Excel cho người dùng, sau đó người dùng nhập 2 cột STT và Họ và tên. Khi nhấn Button, ta sẽ đọc 2 cột này vào DataGridView (dgvData).

  1.     Dim App As New Application With {.Visible = True, .SheetsInNewWorkbook = 1}
  2.     Dim WBook As Workbook = App.Workbooks.Add
  3.     Dim WSheet As Worksheet = WBook.Worksheets.Add
  4.     Private Sub butImport_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butImport.Click
  5.         Dim i As Integer = 1
  6.         'Đặt bẫy lỗi, vì có thể người dùng đóng Excel rồi nhấn nút
  7.         Try
  8.             dgvData.Rows.Clear()
  9.             'Lặp cho đến khi ô Ai (hoặc sửa thành Bi) là ""
  10.             Do Until (WSheet.Range("A" & i).Value = Nothing)
  11.                 'Tạo một dòng mới trong Datagridview
  12.                 dgvData.Rows.Add()
  13.                 'Lấy dữ liệu từ Range con
  14.                 dgvData.Rows(i - 1).Cells(0).Value = WSheet.Range("A" & i).Value
  15.                 dgvData.Rows(i - 1).Cells(1).Value = WSheet.Range("B" & i).Value
  16.                 'Tăng dòng lên 1
  17.                 i += 1
  18.             Loop
  19.             MessageBox.Show("Đã nhập xong", "Nhập", MessageBoxButtons.OK, MessageBoxIcon.Information)
  20.         Catch ex As Exception
  21.             MessageBox.Show("Có lỗi xảy ra, hãy chắc Excel còn mở", "Lỗi", _
  22.                 MessageBoxButtons.OK, MessageBoxIcon.Error)
  23.         End Try
  24.     End Sub
  25.  
  26.      Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
  27.         Try
  28.             App.Quit()
  29.         Catch
  30.         End Try
  31.     End Sub


3. Ghi dữ liệu :
Để đơn giản, ta chỉ việc dùng Range.Value để đặt giá trị thôi. Ngoài ra còn có thuộc tính Value2.
Value2 là gì? Theo MSDN, Value2 là dữ liệu không dùng kiểu Currecy và Date. Phụ thuộc vào Format của ô mà ô sẽ trả về giá trị Value hay Value2.
Việc ghi có tác dụng cả Range lớn và nhỏ (có vẻ dùng cho Range lớn không thực tế, do tất cả ô trong Range đều có chung giá trị).

VB.NET

  1.     Private Sub butExport_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butExport.Click
  2.         WSheet.Range("A1").Value = "A"
  3.         WSheet.Range("A2").Value2 = "B"
  4.     End Sub


To be continued...

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 05/06/2009 5:16 pm

Phụ lục 1 : Hàm trả về tên cột thứ n + 1 :

VB.NET

Mã: Chọn hết

  1. Public Function N2C(ByVal Number As Integer) As String
  2.         Dim St As String = IIf(Number >= 26, Chr(Int(Number / 26) + 64), "") & Chr(Number Mod 26 + 65)
  3.         Return St
  4. End Function


C#

Mã: Chọn hết

  1. public string N2C(int Number)
  2. {
  3.     string St = (Number >= 26 ? Strings.Chr(Conversion.Int(Number / 26) + 64) : "") + Strings.Chr(Number % 26 + 65);
  4.     return St;
  5. }


Ví dụ : Number là 0 sẽ trả về A

4. Xác định range đã sử dụng :
Ở ví dụ trên, ta đã nhập dữ liệu vào bằng cách lấy cho đến khi tìm thấy ô không có giá trị. Bây giờ đề yêu cầu là nhập TẤT CẢ dữ liệu trong Excel vào lưới, ta không thể chạy hết toàn bộ hàng và cột được do số lượng quá lớn. Thay vào đó, ta sẽ xác định xem dữ liệu nằm trong range nào. Để làm việc này, Excel cung cấp cho ta thuộc tính UsedRange.

VB.NET

Mã: Chọn hết

  1.        Dim Rng As Range = WSheet.UsedRange
  2.         MsgBox("Bạn đã sử dụng range : " & Replace$(Rng.Address, "$", ""))


C#

Mã: Chọn hết

  1. {
  2.     Range Rng = WSheet.UsedRange;
  3.     Interaction.MsgBox("Bạn đã sử dụng range : " + Strings.Replace(Rng.Address, "$", ""));
  4. }


Ghi chú : Nếu không có ô nào được dùng, kết quả trả về ô A1.

5. Đọc dữ liệu bằng mảng :
Sau khi xác định được range đã sử dụng, bạn có thể đọc dữ liệu từng ô để ghi vào DataGridView. Tuy nhiên, bạn lại phải phân tích chuỗi để lấy ô đầu và ô cuối. Thay vào đó ta dùng luôn thuộc tính Value của Range.
Thuộc tính Value của Range lớn sẽ trả về mảng 2 chiều, là hàng và cột của ô đó (tính từ 1).

VB.NET

Mã: Chọn hết

  1.        Dim Rng As Range = WSheet.UsedRange
  2.         Dim Data = Rng.Value
  3.         With dgvData
  4.             .Rows.Clear()
  5.             .Columns.Clear()
  6.             For i As Integer = 0 To Rng.Columns.Count - 1
  7.                 .Columns.Add("clm" & N2C(i), N2C(i))
  8.             Next
  9.             For i As Integer = 0 To Rng.Rows.Count - 1
  10.                 .Rows.Add()
  11.                 For j As Integer = 0 To Rng.Columns.Count - 1
  12.                     .Rows(i).Cells(j).Value = Data(i + 1, j + 1)
  13.                 Next
  14.             Next
  15.         End With


C#

Mã: Chọn hết

  1. {
  2.     Range Rng = WSheet.UsedRange;
  3.     var Data = Rng.Value;
  4.     {
  5.         dgvData.Rows.Clear();
  6.         dgvData.Columns.Clear();
  7.         for (int i = 0; i <= Rng.Columns.Count - 1; i++) {
  8.             dgvData.Columns.Add("clm" + N2C(i), N2C(i));
  9.         }
  10.         for (int i = 0; i <= Rng.Rows.Count - 1; i++) {
  11.             dgvData.Rows.Add();
  12.             for (int j = 0; j <= Rng.Columns.Count - 1; j++) {
  13.                 dgvData.Rows(i).Cells(j).Value = Data(i + 1, j + 1);
  14.             }
  15.         }
  16.     }
  17. }

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 11/06/2009 5:46 pm

IV. Thao tác với tập tin Excel :
Bây giờ đề yêu cầu bạn thế này :

Excel.jpg
Excel.jpg (14.68 KiB) Đã xem 23658 lần


- Cho sẵn file Excel tên là Input.xlsx ở thư mục My Document có 1 worksheet, với dữ liệu sau :
- Trong form của bạn có 1 DataGridView có 2 cột là Họ và tên và Địa chỉ và 1 button.
- Người dùng lần lượt nhập tên và địa chỉ vào DataGridView. Cuối cùng nhấn Button.
- Dùng mẫu thiết kế đã cho, nhập vào Excel nội dung ấy (STT chương trình tự gán), cuối cùng save thành tập tin Output.xlsx cũng ở thư mục My Document.

Mã: Chọn hết

  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


Tóm tắt :

Mã: Chọn hết

  1.  
  2. Dim <tên biến> As Workbook = App.Workbooks.Open(Path)
  3. WBook.SaveAs(OutputPath)
  4. WBook.Save

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 » CN 05/07/2009 4:18 pm

V. Định dạng trong Excel :
1. Định dạng khung :
a. Khung đơn giản :
Bây giờ, yêu cầu cao hơn là bạn phải trình bày cho đẹp và chuyên nghiệp, và một trong số đó chính là định dạng khung (Border) cho Excel.

Excel cung cấp cho ta một phương thức để đóng khung một cell hay một Range là BorderAround. Trong khi đang thực hiện bài này, mình vô tình cài Office 2010 và phát hiện Microsoft Office 2010 không còn BorderAround nữa mà là BorderAround2. Về nguyên tắc, chúng giống nhau, nhưng BorderAround không có tham số gì nữa, còn BorderAround2 cho phép bạn chọn một số như kiểu viền, kích thước, màu, … . Đoạn code gốc :

Mã: Chọn hết

  1.            WSheet.Range("A" & i + 3).Value = i + 1
  2.             WSheet.Range("B" & i + 3).Value = dgvData.Rows(i).Cells(0).Value
  3.             WSheet.Range("C" & i + 3).Value = dgvData.Rows(i).Cells(1).Value

Đoạn code sửa chữa :

Mã: Chọn hết

  1.            WSheet.Range("A" & i + 3).Value = i + 1
  2.             WSheet.Range("A" & i + 3).BorderAround2()
  3.             WSheet.Range("B" & i + 3).Value = dgvData.Rows(i).Cells(0).Value
  4.             WSheet.Range("B" & i + 3).BorderAround2()
  5.             WSheet.Range("C" & i + 3).Value = dgvData.Rows(i).Cells(1).Value
  6.             WSheet.Range("C" & i + 3).BorderAround2()


Lưu ý : Khi bạn dùng BorderAround đối với Range lớn, nó chỉ đóng khung bên ngoài range đó, các ô bên trong sẽ không được đóng khung.

ShareToShare
Mạnh Thường Quân
Mạnh Thường Quân
Bài viết: 167
Ngày tham gia: T.Năm 27/11/2008 4:04 pm
Has thanked: 1 time

Re: Lập trình Microsoft Office Excel

Gửi bàigửi bởi ShareToShare » T.Ba 14/07/2009 3:17 pm

bài viết hay đấy Đạt
thanks

lazybn
Bài viết: 1
Ngày tham gia: T.Bảy 25/07/2009 11:24 am

Re: Lập trình Microsoft Office Excel

Gửi bàigửi bởi lazybn » T.Bảy 25/07/2009 9:55 pm

Mình tạo 1 form (dutoan) và add reference đầy đủ sau đó thì cho code của bạn vào form_load.
Để thử làm theo hướng dẫn của bạn thì bị báo lỗi

Mã: Chọn hết

  1. Public Class dutoan
  2.     Private Sub dutoan_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  3.        
  4.         Imports Microsoft.Office.Interop.Excel
  5.         'Gọi một chương trình Excel
  6.         Dim App As New Application
  7.  
  8.         'Hiện Excel lên, bỏ dòng này nếu muốn chạy ẩn
  9.         App.Visible = True
  10.         'Khi khởi tạo 1 Workbook, sẽ tạo 1 worksheet
  11.         App.SheetsInNewWorkbook = 1
  12.         'Tạo một Workbook và quản lí bằng biến WBook
  13.         '(Workbook là 1 cửa sổ Excel, Worksheet là 1 trang)
  14.         Dim WBook As Workbook = App.Workbooks.Add
  15.         'Tạo một Worksheet và quản lí bằng biến WSheet
  16.         Dim WSheet As Worksheet = WBook.Worksheets.Add
  17.         'Đừng quên tắt Excel! (nếu chạy ẩn, process của Excel vẫn còn khi thoát chương trình)
  18.         App.Quit()
  19.     End Sub
  20. End Class


Chương trình báo lỗi như sau:
Error 1 'Imports' statements must precede any declarations. C:\Documents and Settings\Admin\My Documents\Visual Studio 2008\Projects\DuToan 691\DuToan 691\dutoan.vb 3 5 DuToan 691
Error 2 Type 'System.Windows.Forms.Application' has no constructors. C:\Documents and Settings\Admin\My Documents\Visual Studio 2008\Projects\DuToan 691\DuToan 691\dutoan.vb 5 9 DuToan 691
Error 3 Declaration expected. C:\Documents and Settings\Admin\My Documents\Visual Studio 2008\Projects\DuToan 691\DuToan 691\dutoan.vb 8 9 DuToan 691
Error 4 Declaration expected. C:\Documents and Settings\Admin\My Documents\Visual Studio 2008\Projects\DuToan 691\DuToan 691\dutoan.vb 10 9 DuToan 691
Error 5 Type 'Workbook' is not defined. C:\Documents and Settings\Admin\My Documents\Visual Studio 2008\Projects\DuToan 691\DuToan 691\dutoan.vb 13 18 DuToan 691
Error 6 Type 'Worksheet' is not defined. C:\Documents and Settings\Admin\My Documents\Visual Studio 2008\Projects\DuToan 691\DuToan 691\dutoan.vb 15 19 DuToan 691


Mong bạn giúp đỡ!

Lần sau bạn đưa vào thẻ code đối với code, những thông báo nên đưa vào thẻ quote.

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 » CN 26/07/2009 3:59 pm

Bạn đưa cái dòng Imports lên đầu tất cả, kể cả khai báo Class!

@All : em bận thi Tin học trẻ, nên tạm thời ngưng Tut này >.<

ktttnotc
Thành viên chính thức
Thành viên chính thức
Bài viết: 26
Ngày tham gia: T.Hai 27/07/2009 6:44 pm
Has thanked: 2 time
Liên hệ:

Re: Lập trình Microsoft Office Excel

Gửi bàigửi bởi ktttnotc » T.Hai 27/07/2009 8:35 pm

bác cho em hỏi ti, em có 1 bang excel và muốn lấy dữ liệu từ file excel đó vào datagridview nhưng khồng biết làm thế nào để format các cột trong datagfidview bác có thể chỉ cho em được không đây là code để lấy dữ liệu của em :

Mã: Chọn hết

  1. Try
  2.             Dim MyConnection As System.Data.OleDb.OleDbConnection
  3.             Dim DtSet As System.Data.DataSet
  4.             Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
  5.             MyConnection = New System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source='c:\lichbayngay.xls';Extended Properties=Excel 8.0;")
  6.             MyCommand = New System.Data.OleDb.OleDbDataAdapter("select * from [Sheet1$]", MyConnection)
  7.             MyCommand.TableMappings.Add("Table", "TestTable")
  8.             DtSet = New System.Data.DataSet
  9.             MyCommand.Fill(DtSet)
  10.             DataGridView1.DataSource = DtSet.Tables(0)
  11.             MyConnection.Close()
  12.         Catch ex As Exception
  13.             MsgBox(ex.ToString)
  14.         End Try

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 27/07/2009 8:45 pm

Cái này... bạn qua bên Nêu thắc mắc hỏi đi, mấy cái này mình chịu thôi :(

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 01/08/2009 4:26 pm

Tên bài viết: Lập trình Microsoft Office Excel


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
Phần xuất ra Excel thì OK rồi, nhưng còn tính hiệu thời gian thì mình chưa làm được!
Bạn nào biết xin chỉ giáo!
Thanks all!
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 01/08/2009 5:02 pm

À Cell (Range nhỏ) có thuộc tính Formula đấy 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 » CN 02/08/2009 4:27 pm

À Cell (Range nhỏ) có thuộc tính Formula đấy bạn!

--> Cảm ơn vì gợi ý của Đạt! =D>
Ah, khi nào thi xong thì ta tiếp tục bàn luận thêm về chủ đề này nhé!
Mình đang làm về phần này nên cũng rất thích!

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.Ba 04/08/2009 9:12 pm

1. Định dạng khung :
b. Khung nâng cao :

Được rồi, giờ không... đơn giản thế nữa. Bạn gặp trường hợp mà :
- Khung đóng bên ngoài khác so với khung bên trong.
- Chỉ đóng khung một phần nào đó (ngang, dọc, chéo trái, chéo phải).

Đó là dùng lúc phải vào sâu vào property Border!

Một lưu ý là : Nếu áp dụng với Range lớn, các đường chéo sẽ có ở tất cả các cell trong range, nhưng các đường ngang (trên/dưới) và dọc (trái/phải) chỉ áp dụng với các cell ở cạnh như phương thức BorderAround!

Ví dụ :

Mã: Chọn hết

  1. WSheet.Range("B2", "C4").Borders(XlBordersIndex.xlEdgeBottom).LineStyle = XlLineStyle.xlContinuous


  • XlBordersIndex : Là dạng khung. Ví dụ trên (EdgeTop), dưới (EdgeBottom), ... . Tuy nhiên, tuyệt đối không dùng quan hệ + như một số tham số khác! Nếu bạn muốn đóng khung trên và dưới, chịu khó viết 2 dòng như trên :D
  • XlLineStyle : Chứa những hằng số các kiểu định dạng đường viền như Continous (liên tục), Dash (các dấu gạch), Dot (các dấu chấm), ...

Ngoài ra bạn có thể hiệu chỉnh màu đường viền bằng thuộc tính Color.

Mã: Chọn hết

  1. WSheet.Range("B2", "C4").Borders(XlBordersIndex.xlEdgeTop).Color = Color.Red.ToArgb


Lưu ý : Không hiểu sao code trên khi thực hiện ra thì Excel thực hiện "ngược". Nếu bạn dùng Color.Red thì nó ra màu xanh (Blue), dùng Blue thì ra Red; còn dùng Yellow thì ra Cyan và ngược lại :(. Ai biết cái này cho mình biết nha ;)

và cả độ dày của khung :

Mã: Chọn hết

  1. WSheet.Range("B2", "C4").Borders(XlBordersIndex.xlEdgeTop).Weight = XlBorderWeight.xlMedium


Bạn có thể thay xlMedium thành những giá trị tuỳ thích như xlThin, xlThick, xlHairLine.

Kết thúc phần khung :)

Hình đại diện của người dùng
hoangthu1974
Guru
Guru
Bài viết: 812
Ngày tham gia: T.Năm 09/03/2006 9:30 am
Đến từ: Hà Nội --> Tp. Hồ Chí Minh
Been thanked: 13 time
Liên hệ:

Re: Lập trình Microsoft Office Excel

Gửi bàigửi bởi hoangthu1974 » T.Ba 04/08/2009 10:50 pm

vo_minhdat2007 đã viết:Ngoài ra bạn có thể hiệu chỉnh màu đường viền bằng thuộc tính Color.

Mã: Chọn hết

  1. WSheet.Range("B2", "C4").Borders(XlBordersIndex.xlEdgeTop).Color = Color.Red.ToArgb

Lưu ý : Không hiểu sao code trên khi thực hiện ra thì Excel thực hiện "ngược". Nếu bạn dùng Color.Red thì nó ra màu xanh (Blue), dùng Blue thì ra Red; còn dùng Yellow thì ra Cyan và ngược lại :(. Ai biết cái này cho mình biết nha ;)

Mã: Chọn hết

  1. WSheet.Range("B2", "C4").Borders(XlBordersIndex.xlEdgeTop).Color = Math.Abs(Color.Red.ToArgb + 65281)

Đoạn code này cho ra màu đúng của Excel. Vì màu ToArgb sẽ cho ra một giá trị âm, sau khi bù màu FF01 và đảo ngược giá trị thì sẽ ra màu của Excel là màu ngược với chuỗi RGB. Trong VS, màu là RRGGBB thì giá trị của Excel sẽ là BBGGRR.

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 29/08/2009 9:56 am

2. Định dạng ô :
Chúng ta hãy cùng làm một ví dụ thú vị về định dạng các ô, bao gồm Font chữ và màu nền nhé! Ngoài ra còn rất nhiều thuộc tính khác mà bạn có thể tự tìm ra để đáp ứng nhu cầu của mình.

Cũng như mọi khi, form chúng ta sẽ gồm 1 DataGridview (dgvData) và 1 Button. Trong sự kiện Form_Load, ta hãy cho 3 cột : Style, ForeColor và BackColor :

Mã: Chọn hết

  1.    Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  2.         dgvData.Columns.Add("clmotnStyle", "Font style")
  3.         dgvData.Columns.Add("clmotnBackColor", "BackColor")
  4.         dgvData.Columns.Add("clmotnForeColor", "Forecolor")
  5.     End Sub


Nguyên tắc của chúng ta là : ô đầu sẽ nhập U, B hoặc I (hiện giờ chỉ đơn giản thế, VD thôi mà :D), tương tự cho màu nền và chữ (sẽ là các từ như Red, Yellow, … miễn là máy hiểu được). Và chúng ta sẽ áp dụng cho cả dòng. Nghĩa là nếu dgvData có 4 dòng, thì trong Excel, 4 dòng đầu sẽ thực hiện Style đã định.

Giải thích :
  • Tất nhiên ta không thể nào mà chọn Range lớn từ “A1” đến “XFD1” rồi, vì biết đâu người dùng phiên bản cũ sẽ không tới XFD, hoặc Excel phiên bản mới nó nhiều hơn thì sao :D . Lúc này, hãy cầu cứu đến thuộc tính EntireRow. Tương tự cũng có thuộc tính EntireColumn.
    Thuộc tính EntireRow sẽ trả về một Range lớn là cả dòng đó. Áp dụng được cho cả Range lớn và Range nhỏ. VD đối với Range “A1:A3” thì sẽ trả về 3 dòng từ 1 đến 3.
  • Và trong bất kì Range nào cũng có thuộc tính Font bao gồm :
    - Name : chắc khỏi giải thích :P . VD: Verdana, Tahoma, … .
    - Bold, Underline, Italic, Strikethrough, Subscripts, SuperScripts, … : đều có giá trị Boolean.
    - Size : kích cỡ của ô.
    - Color : Màu chữ, dùng tương tự như màu khung.
  • Nhưng trong đó không có màu nền cho cell. Thực chất Excel dùng riêng cho ta cả một thuộc tính Interior để xếp đặt cho phần nền của Cell. Bạn hãy tự nghiên cứu thêm, có rất nhiều thuộc tính thú vị ^^. Còn giờ ta chỉ sử dụng thuộc tính Color thôi.
    Để tiện, không cần phải tự xét từng trường hợp Red, Yellow, …, bạn có thể dùng phương thức FromName của class Color.

Mã: Chọn hết

  1.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  2.         Dim App As New Application
  3.         App.Visible = True
  4.         Dim WBook As Workbook = App.Workbooks.Add
  5.         Dim WSheet As Worksheet = WBook.Worksheets.Add
  6.  
  7.         For i As Integer = 0 To dgvData.RowCount - 2
  8.             '====Font===='
  9.             With WSheet.Range("A" & i + 1).EntireRow.Font
  10.                 'Kiểu chữ
  11.                 .Name = "Verdana"
  12.                 If dgvData.Rows(i).Cells(0).Value = "B" Then
  13.                     .Bold = True
  14.                 ElseIf dgvData.Rows(i).Cells(0).Value = "I" Then
  15.                     .Italic = True
  16.                 ElseIf dgvData.Rows(i).Cells(0).Value = "U" Then
  17.                     .Underline = True
  18.                 End If
  19.                 'Màu chữ
  20.                 .Color = Math.Abs(Color.FromName(dgvData.Rows(i).Cells(2).Value).ToArgb + 65281)
  21.             End With
  22.             '=====Màu nền====='
  23.             WSheet.Range("A" & i + 1).EntireRow.Interior.Color = Math.Abs(Color.FromName(dgvData.Rows(i).Cells(1).Value).ToArgb + 65281)
  24.         Next
  25.  
  26.     End Sub


Ngoài ra, có thể bạn sẽ gặp trường hợp dữ liệu ít nhưng cột (dòng) rộng hoặc ngược lại, Excel cung cấp cho ta phương thức AutoFit.
AutoFit chỉ áp dụng được với EntireRow (dòng) hoặc EntireColumn (cột), nếu không bạn đừng hỏi tại sao nó lại báo lỗi!

Mã: Chọn hết

  1.        WSheet.Range("A1").EntireRow.AutoFit() 'Tự chỉnh kích thước dòng
  2.         WSheet.Range("A1").EntireColumn.AutoFit() 'Tự chỉnh kích thước cột


P/S : Anh Thư xem lại giúp em cái hàm chuyển đổi màu trong trường hợp này, màu như White, Cyan, ... nó bị sai, bên này thì em không rành lắm :(

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.Tư 02/09/2009 10:11 pm

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ỉ??? :-?
Delfy
Mechatronics Department, Coltech, VNUH.
Webblog:http://delfycoltech.no1.vn

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ư 02/09/2009 10:19 pm

Mã: Chọn hết

  1.                Dim fc As New System.Globalization.CultureInfo("vi-VN", True)
  2.         System.Threading.Thread.CurrentThread.CurrentCulture = fc
  3.         System.Threading.Thread.CurrentThread.CurrentUICulture = fc
  4.         Dim App As New Application
  5.         Dim mPath As String = App.DefaultFilePath '<<== Error(Old format or invalid type library. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD)))
  6.  'Xin chỉ giùm cách khắc phục xự cố để có thể dùng được định dạng CultureInfo("vi-VN", True)
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.Sáu 04/09/2009 4:01 pm

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

  1.                Dim fc As New System.Globalization.CultureInfo("vi-VN", True)
  2.         System.Threading.Thread.CurrentThread.CurrentCulture = fc
  3.         System.Threading.Thread.CurrentThread.CurrentUICulture = fc
  4.         Dim App As New Application
  5.         Dim mPath As String = App.DefaultFilePath '<<== Error(Old format or invalid type library. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD)))
  6.  '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

  1.        Dim App As New Application
  2.         App.Visible = True
  3.         App.UserControl = True
  4.         Dim oldCI As System.Globalization.CultureInfo = _
  5.             System.Threading.Thread.CurrentThread.CurrentCulture
  6.         Dim fc As New System.Globalization.CultureInfo("vi-VN", True)
  7.         System.Threading.Thread.CurrentThread.CurrentCulture = fc
  8.         System.Threading.Thread.CurrentThread.CurrentUICulture = fc
  9.         Dim mPath As String = App.DefaultFilePath
  10.         MsgBox(mPath)
  11.         System.Threading.Thread.CurrentThread.CurrentCulture = oldCI


Kết quả =D>
untitled.JPG
untitled.JPG (6.36 KiB) Đã xem 22488 lần

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 04/09/2009 4:04 pm

À mà sao test code của xuanquy đâu có bị lỗi?


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.2 khách