Trang 1 trên 4

Lập trình Microsoft Office Excel

Đã gửi: T.Ba 02/06/2009 4:20 pm
gửi bởi vo_minhdat2007
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

Re: Lập trình Microsoft Office Excel

Đã gửi: T.Ba 02/06/2009 5:35 pm
gửi bởi vo_minhdat2007
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 22467 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...

Re: Lập trình Microsoft Office Excel

Đã gửi: T.Sáu 05/06/2009 5:16 pm
gửi bởi vo_minhdat2007
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. }

Re: Lập trình Microsoft Office Excel

Đã gửi: T.Năm 11/06/2009 5:46 pm
gửi bởi vo_minhdat2007
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 25675 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

Re: Lập trình Microsoft Office Excel

Đã gửi: CN 05/07/2009 4:18 pm
gửi bởi vo_minhdat2007
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.

Re: Lập trình Microsoft Office Excel

Đã gửi: T.Ba 14/07/2009 3:17 pm
gửi bởi ShareToShare
bài viết hay đấy Đạt
thanks

Re: Lập trình Microsoft Office Excel

Đã gửi: T.Bảy 25/07/2009 9:55 pm
gửi bởi lazybn
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.

Re: Lập trình Microsoft Office Excel

Đã gửi: CN 26/07/2009 3:59 pm
gửi bởi vo_minhdat2007
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 >.<

Re: Lập trình Microsoft Office Excel

Đã gửi: T.Hai 27/07/2009 8:35 pm
gửi bởi ktttnotc
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

Re: Lập trình Microsoft Office Excel

Đã gửi: T.Hai 27/07/2009 8:45 pm
gửi bởi vo_minhdat2007
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 :(

Re: Lập trình Microsoft Office Excel

Đã gửi: T.Bảy 01/08/2009 4:26 pm
gửi bởi Bacrua
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!

Re: Lập trình Microsoft Office Excel

Đã gửi: T.Bảy 01/08/2009 5:02 pm
gửi bởi vo_minhdat2007
À Cell (Range nhỏ) có thuộc tính Formula đấy bạn!

Re: Lập trình Microsoft Office Excel

Đã gửi: CN 02/08/2009 4:27 pm
gửi bởi Bacrua
À 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!

Re: Lập trình Microsoft Office Excel

Đã gửi: T.Ba 04/08/2009 9:12 pm
gửi bởi vo_minhdat2007
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 :)

Re: Lập trình Microsoft Office Excel

Đã gửi: T.Ba 04/08/2009 10:50 pm
gửi bởi hoangthu1974
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.

Re: Lập trình Microsoft Office Excel

Đã gửi: T.Bảy 29/08/2009 9:56 am
gửi bởi vo_minhdat2007
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 :(

Re: Lập trình Microsoft Office Excel

Đã gửi: T.Tư 02/09/2009 10:11 pm
gửi bởi Bacrua
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ỉ??? :-?

Re: Lập trình Microsoft Office Excel

Đã gửi: T.Tư 02/09/2009 10:19 pm
gửi bởi xuanquy_th

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)

Re: Lập trình Microsoft Office Excel

Đã gửi: T.Sáu 04/09/2009 4:01 pm
gửi bởi vo_minhdat2007
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 24505 lần

Re: Lập trình Microsoft Office Excel

Đã gửi: T.Sáu 04/09/2009 4:04 pm
gửi bởi vo_minhdat2007
À mà sao test code của xuanquy đâu có bị lỗi?