Tóm tắt: Trích xuất dữ liệu nghiệp vụ là một thách thức mà mọi công ty
đều phải đối mặt. Khám phá một số bí quyết về trích xuất dữ liệu từ Excel và
chuyển đổi nó giữa Excel và XML bằng công nghệ
Java™.
Giới thiệu
Số lý do sáng tạo 432: Báo cáo có hại cho môi trường.
Các biểu đồ và các báo cáo tiêu thụ cây xanh. Các phiên bản thiết bị điện
tử sử dụng điện và các nhiên liệu hóa thạch. Có lẽ một công ty có thể "đi
luồng xanh" và dừng viết báo cáo được không?
Việc khai thác các báo cáo cho nhân viên cấp cao có thể làm cho các nhà lập
trình Java lo lắng, đặc biệt là khi các nhà lập trình thích kết quả đầu ra
thân thiện với nhà phát triển, chẳng hạn như XML, nhưng việc quản lý cấp
cao chỉ diễn đạt ngôn ngữ của các bảng tính có hỗ trợ giao diện người dùng
đồ họa.
Lo lắng có thể làm tăng "đầu ra" khí nhà kính của các nhà lập trình có liên
quan, đặc biệt là khi họ bắt đầu thở quá nhanh. Mặc dù báo cáo cần có thời
gian và nguồn lực, những cần thiết đưa ra tầm nhìn dự án cho ban quản lý
cao cấp hơn. Ban quản lý có thể không tin các nhóm làm việc tích cực chỉ
đơn giản vì các cấp cao hơn không thể thấy các nhóm của mình đang làm gì.
Vì vậy, báo cáo là vấn đề sống còn đối với môi trường làm việc.
Một vài thủ thuật Java có thể làm tăng thêm "vài dặm đường cho mỗi gallon"
của một nhà lập trình khi làm việc với các báo cáo của những người ưa
thích bảng tính. Sau khi đọc các bước của bài viết này, một nhà lập trình
Java có trình độ trung cấp cần hiểu rõ các nguyên tắc cơ bản đằng sau việc
chuyển đổi dữ liệu bằng lập trình giữa Microsoft® Excel® và XML.
Excel với các Java
API
Có một số Java API thao tác các tệp Excel. API nào là tốt nhất? Nó phụ
thuộc vào các nhu cầu cá nhân và mức độ kinh nghiệm của bạn.
Java API của Andy Excel Khan
Andy Khan đã tạo ra một API được gọi là Java Excel API, hoặc JExcel
API (xem Tài nguyên). API mã nguồn mở này có thể
đọc và viết các bảng tính Excel. Ngoài ra, vì nó nhẹ, nên nó là một sự lựa
chọn tốt cho các nhà phát triển Java mới bắt đầu. Sơ đồ Ngôn ngữ mô hình
hóa thống nhất (UML) tiện dụng làm cho nó dễ dùng hơn và do đó, tạo ra
cộng đồng hỗ trợ của API.
API này cũng có một vài nhược điểm. Mặc dù nó đọc được các định dạng tệp
Microsoft Excel 95, Excel 97, Excel 2000, Excel 2002 và Excel 2003, những
hiện nay nó không làm việc với bất kỳ định dạng Excel mới hơn nào. Nó
không thể tạo các biểu đồ, các đồ thị, hoặc các macro, và nó chỉ hỗ trợ
các tệp PNG cho các ảnh.
Trình điều khiển xlSQL Excel
JDBC
Một API Excel-cho-Java khác là trình điều khiển JDBC (Java Database
Connectivity - Kết nối cơ sở dữ liệu Java Excel xlSQL) của Excel xlSQL
(xem Tài nguyên), một API mã nguồn mở để truy vấn
các tệp Excel khi chúng đã là các cơ sở dữ liệu. Với nó, các nhà phát
triển xử lý các bảng tính Excel giống như các bảng trong một cơ sở dữ
liệu. Nếu bạn đã quen thuộc với SQL và JDBC, đây có thể là phương thức đơn
giản nhất để lấy ra dữ liệu. Bạn cũng có thể thêm dữ liệu bằng cách sử
dụng các lệnh SQL
insert
. Thật không may, trình
điều khiển xlSQL Excel JDBC hiện nay chưa có hoặc chưa được hỗ trợ tích
cực.
OpenXLS
OpenXLS (xem Tài nguyên) là phiên bản nguồn mở của
một sản phẩm thương mại của Extentech gọi là ExtenXLS. OpenXLS có các khả
năng mở rộng. Về lập trình nó có thể thay đổi các công thức và sử dụng
nhiều tùy chọn định dạng. Không giống như một số các sản phẩm mã nguồn mở,
nó có thể làm việc với các đối tượng phức tạp, bao gồm các vùng có tên,
các bảng trụ (pivot table), các khung phân chia và các biểu đồ. Ngoài ra,
khi so sánh với các sản phẩm tương tự, OpenXLS có nhiều tài liệu trả tiền
trước trọn vẹn hơn với các tính năng có sẵn. Thật không may, mặc dù phiên
bản mã nguồn mở này hỗ trợ các định dạng Excel từ 97 đến 2003, những chỉ
có phiên bản thương mại hỗ trợ Excel 2007.
Apache POI
Apache POI là một tập các Java API để làm việc với cả hai tài liệu chuẩn
Microsoft cũ hơn và mới hơn. Ngoài làm việc với các phiên bản Excel từ 97
trở đi, Apache POI có thể làm việc với các tệp Microsoft Word và
PowerPoint®. Bạn có thể tận dụng kiến thức làm việc với các tệp Excel
của bạn để nhanh chóng tìm hiểu thêm cách làm việc với các kiểu tệp bổ
sung này. Ngoài ra còn có một cộng đồng hỗ trợ tích cực cho API này. Tuy
nhiên, vì Apache POI có rất nhiều chức năng và có thể làm việc với các tệp
khác, nên có lẽ nhà phát triển phải cố gắng hơn để làm việc chỉ với các
tệp Excel cần tìm hiểu.
Bài viết này sử dụng Apache POI do cộng đồng hỗ trợ và chức năng phong phú
của nó.
Các Java XML API
XML là một định dạng dữ liệu phổ biến, và có một số cách để làm việc với
XML theo công nghệ Java. Bạn có thể chọn bất cứ XML API nào làm việc tốt
nhất cho dự án của bạn. Tuy nhiên, bài viết này sử dụng XML API hiệu quả
và đơn giản của Elliotte Rusty Harold được gọi là XOM. Để biết thêm
thông tin về các XML API Tài nguyên.
Ứng dụng mẫu
Ứng dụng mẫu trong bài viết này bắt đầu với một tệp bảng tính Excel do
Phòng Nguồn nhân lực của Tổng công ty Điện lực Planet hư cấu cung cấp.
Bảng tính này được gọi là Employee_List.xls.
Bài viết này trình bày cách sử dụng công nghệ Java và Apache POI để đọc từ
tệp Employee_List.xls. Tệp lớp Java cho trình diễn này là
ExcelReader.java
và có trong một dự án Eclipse.
Hãy tải tệp zip có chứa bảng tính mẫu và dự án Eclipse trong phần Tải về. Tệp Readme.txt trong dự án Eclipse sẽ
giải thích mã mẫu bổ sung có trong bản tải về.
Phần 2 của loạt bài này sẽ giải thích cách chuyển đổi thông tin sang XML và
tạo một bảng tính mới có một vài sửa đổi so với dữ liệu ban đầu.
Cài đặt
Để chuẩn bị máy tính của bạn chạy các ví dụ mẫu trong bài viết này, hãy
hoàn thành các bước sau đây:
- Tải về bảng tính Excel và mã mẫu.
- Tạo thư mục C:\Planet Power, và trích xuất các tệp vào nó.
- Tải về Eclipse bằng cách sử dụng liên kết trong phần Tài nguyên. Sau khi tải Eclipse, trích xuất nó vào thư mục C:\Program Files\Eclipse.
- Từ liên kết trong phần Tài nguyên, tải XOM qua liên kết Complete zip trên trang web XOM. Sau đó, trích xuất các tệp vào thư mục C:\Program Files\Eclipse\lib.
- Tải Apache POI qua liên kết trong phần Tài nguyên. Trích xuất vào thư mục C:\Program Files\Eclipse\lib. (Bạn sẽ cần phải tạo thư mục lib).
Bây giờ bạn đã sẵn sàng để bắt đầu làm việc trong Eclipse.
Khởi động Eclipse
Để bắt đầu làm việc với Eclipse IDE, hoàn thành các bước sau:
- Khởi động Eclipse bằng cách chuyển hướng đến C:\Program Files\Eclipse\eclipse và nhấn đúp chuột vào tệp eclipse.exe. Nếu Windows® sẽ hiển thị một cảnh báo bảo mật, nhấn Run.
- Trong cửa sổ Workspace Launcher (Trình khởi chạy vùng làm
việc), thay thế đường dẫn có nhãn Workspace bằng
C:\Eclipse_Projects
, rồi nhấn OK. - Khi Eclipse kết thúc nạp, nhấn vào biểu tượng Workbench (Bàn
làm việc) ở phía bên phải của cửa sổ này (xem Hình
1).
Hình 1. Biểu tượng Workbench
- Nhấn chuột phải vào ô Package Explorer (Trình thám hiểm gói), rồi nhấn vào Import (Nhập khẩu).
- Mở rộng General, và chọn Existing Projects into
Workspace (Các dự án hiện có trong Workspace). Nhấn
Next (xem Hình 2).
Hình 2. Đặt một dự án hiện có vào trong vùng làm việc
- Nhấn Browse (đặt bên cạnh Select root directory - Chọn thư mục gốc), và chuyển hướng đến C:\Planet Power\Employees. Chọn thư mục Employees (Nhân viên), rồi nhấn OK.
- Nhấn Finish (Kết thúc), như trong Hình 3.
Hình 3. Nhập một dự án vào Eclipse
Bây giờ thư mục Employees sẽ xuất hiện trong ô Package Explorer.
Tạo sẵn XOM và Apache POI với
Eclipse
Về mặt kỹ thuật, các bước trong phần này đã được thực hiện trong dự án
Employees Eclipse đã nhập khẩu. Tuy nhiên, trong trường hợp bạn bắt đầu dự
án riêng của mình từ đầu, bạn sẽ cần nói cho dự án Eclipse biết để sử dụng
các bản tải về XOM và Apache POI mới. Hãy hoàn thành các bước sau:
- Nhấn chuột phải vào thư mục Employees trong Package Explorer, rồi nhấn Properties (Các đặc tính).
- Nhấn Java Build Path (Đường dẫn xây dựng Java) ở ô bên trái.
- Nhấn thẻ Libraries (Các thư viện).
- Nhấn Add External JARs (Thêm các JAR bên ngoài), như trong Hình 4.
Hình 4. Thêm các tệp JAR ngoài vào đường dẫn xây dựng này
- Chọn tệp lưu trữ Java (JAR) có chứa các phần của Apache POI mà bạn sẽ sử dụng trong ví dụ mẫu này. (Nếu bạn đang sử dụng cùng một phiên bản POI như bài viết này, đường dẫn sẽ là C:\Program Files\Eclipse\lib\poi-3.6\poi-3.6-20091214.jar). Nhấn Open (Mở).
- Nhấn lại Add External JARs.
- Chọn tệp JAR chứa XOM (Nếu bạn đang sử dụng cùng một phiên bản POI như bài viết này, đường dẫn sẽ là C:\Program Files\Eclipse\lib\XOM\xom-1.2.1.jar). Nhấn Open.
- Nhấn OK.
Sử dụng tệp
ExcelReader.java
Với bài viết này, hãy sử dụng tệp ExcelReader.java nằm trong thư mục dự án
Employees bên dưới thư mục src\(default package). Hình 5 bên dưới thư mục.
Hình 5. Mở dự án Employees
Để chạy tệp này, nhấn vào nút mũi tên Run ở trên cùng màn hình, như
trong Hình 6.
Hình 6. Chạy một tệp Java
Tệp ExcelReader.java đang chạy đọc thông tin từ các ô trong bảng tính
Employee_List.xls và hiển thị nó bằng cách sử dụng thẻ Console của
Eclipse, như trong Hình 7.
Hình 7. Kết quả đầu ra Java trong bàn giao diện Eclipse
Bắt đầu
Chìa khóa để hiểu công nghệ Java rất quen thuộc với ý tưởng làm việc với
các đối tượng và khởi tạo (có nghĩa là tạo ra) các đối tượng đó. Định dạng
chuẩn để tạo ra các đối tượng phù hợp là:
class objectName = new class(); |
objectName
là tên của đối tượng mới được tạo ra.
Nó giống như một biến dùng để xác định và đưa ra một cách làm việc với đối
tượng cụ thể đó. Ngoài ra, thông tin, thường ở dạng các đối tượng khác
hiện có, có thể đặt trong các dấu ngoặc đơn
(()
) sau class
.
Thông tin bên trong các dấu ngoặc đơn được sử dụng để tạo đối tượng mới.
Làm việc với các tệp
Bất cứ khi nào bạn làm việc với các tệp trong một môi trường Java, bạn có
thể gặp nhiều vấn đề với tệp. Ví dụ, có thể thiếu tệp. Vì vậy, việc cố đọc
một tệp có thể gây ra lỗi. Hãy nắm lấy bất kỳ các trường hợp ngoại lệ nào
có thể do việc thao tác các tệp gây ra.
Để làm việc với các tệp Excel, bài viết này sử dụng lớp
FileInputStream
(java.io.FileInputStream
). Lớp
FileInputStream
mô tả một tệp có thể không được
tạo bằng văn bản thông thường. Vì các tệp Excel có chứa dữ liệu nhị phân,
nên sử dụng FileInputStream
thay cho lớp
FileReader
, dùng để đọc các tệp chỉ chứa các ký
tự văn bản.
Bắt đầu lập trình
Bước đầu tiên để đọc một bảng tính Excel (Excel workbook) là chuẩn bị sử
dụng Apache POI và các lớp cần thiết khác. Các lớp này đòi hỏi tệp
ExcelReader.java có chứa một số lớp Apache POI, một số lớp ngoại lệ (lỗi),
và một số lớp xử lý tệp. Liệt kê 1 cho thấy mã ở phần
đầu của tệp ExcelReader.java, nhập khẩu các lớp này để tạo sẵn chúng cho
sử dụng.
Liệt kê 1. Nhập khẩu các lớp (ExcelReader.java)
import java.io.FileInputStream; import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; |
Sau khi nhập khẩu các lớp có liên quan, bạn có thể bắt đầu lập trình bên
trong phần thân của phương thức chính bằng Apache POI.
HSSF có ý nghĩa gì trong Apache
POI?
Các nhà lập trình Apache POI API chọn một quy ước đặt tên lạ thường cho các
lớp của họ liên quan đến các bảng tính Excel; họ sử dụng tiền tố
HSSF. Theo các tài liệu Java (Javadocs) của nó, tiền tố này
thực sự là viết tắt của cụm từ Horrible Spread Sheet Format (Định
dạng Bảng tính đáng ghét). Trong thực tế, theo Wikipedia, POI xuất phát từ
nghĩa là Poor Obfuscation Implementation (Công cụ rắc rối đáng
thương). Ai nói các nhà lập trình không biết đùa nào?
Các lớp HSSF dùng để làm việc với các phiên bản Excel có trước năm 2007
(nghĩa là các tệp .xls). Một tập các lớp khác
—XSSF— dùng cho cho Excel 2007 và mới
hơn (nghĩa là các tệp .xlsx). Tuy nhiên, có một tập —các
lớp— làm việc với cả hai phiên bản. Vì mục tiêu đơn
giản hóa, bài viết này chỉ sử dụng các lớp HSSF. Các mẫu mã có sử dụng các
lớp khác được xác định trong tệp Readme.txt trong dự án Eclipse mà bạn đã
tải xuống.
Các bảng tính
Lớp HSSF, đại diện cho một bảng tính Excel trong Apache POI, là
org.apache.poi.hssf.usermodel.HSSFWorkbook
.
Chuyển cho HSSFWorkbook
một
FileInputStream
làm hàm tạo của nó, và bạn có
thể đòi hỏi nó biểu diễn tệp này nhờ dựa vào
FileInputStream
.
Nhưng hãy chờ đợi! Trong Javadocs cho Apache POI, không có hàm tạo nào dành
cho
HSSFWorkbook
nói rằng nó có thể lấy một
FileInputStream
. Có một
FileInputStream
đang sử dụng một tính năng
không có cơ sở không? Không. Có một hàm tạo chấp nhận một
InputStream
.
Vì
FileInputStream
là một lớp con của
InputStream
, về mặt kỹ thuật nó cũng là một
InputStream
, vì vậy có thể chuyển nó vào trong
hàm tạo. Trong thực tế, InputStream
là trừu
tượng, do đó, cần có một số loại lớp con.
FileInputStream
sẽ làm việc một cách tốt đẹp.
Khi tạo
FileInputStream
, chuyển cho nó một
String
mô tả đường dẫn đến tệp Excel cần đọc.
Đối với các tệp Windows®, hãy tránh có bất kỳ các ký tự đặc biệt
trong đường dẫn tệp, đặc biệt là các dấu gạch chéo ngược phân cách-thư mục
(\
). Sử dụng những dấu chéo ngược kép
(\\
) để tạo ra một dấu gạch chéo ngược thoát
trong chuỗi đường dẫn tệp.
Mã trong Liệt kê 2 tạo một
FileInputStream
mới, rồi tạo một
HSSFworkbook
mới dựa vào
FileInputStream
đó. Liệt kê 2. Đọc một tệp Excel (ExcelReader.java)
public static void main(String[] args) { // Create a FileInputStream to hold the file. // Use double back-slashes to create one "escaped" slash. // Use error handling (try/catch) around its creation in case // the file to read does not exist. // Be sure to import java.io.FileNotFoundException and java.io.IOException, or use // the superclass IOException to handle both. try { FileInputStream excelFIS = new FileInputStream("C:\\Planet Power\\Employee_List.xls"); // Create an Excel Workbook Object using the FileInputStream created above // (which contains the file). // Use error handling around its creation in case of Input/Output Exception HSSFWorkbook excelWB = new HSSFWorkbook(excelFIS); } catch (IOException e) { System.out.println("Input/Output Exception!"); } //End Main Method } |
Bây giờ, khi đang ở trong câu lệnh xử lý lỗi
try
tiến hành thu thập thông tin từ bảng tính Excel, bắt đầu với các tờ bảng
tính của nó.
Các tờ bảng tính và các hàng
Một bảng tính có thể có một vài tầng các trang được gọi là các tờ.
Lớp
HSSFSheet
(org.apache.poi.hssf.usermodel.HSSFSheet
) mô tả
một đối tượng tờ.
Một bảng tính có bao nhiêu tờ? Để tìm hiểu, bạn có thể sử dụng phương thức
getNumberOfSheets()
trên bảng tính. Tuy nhiên,
với bài tập này, chỉ có một tờ, do đó, sử dụng số tờ của nó sẽ đơn giản
hơn. Số của tờ đầu tiên là không (các máy tính thích đếm bắt đầu bằng
không thay vì một). Mã sẽ trông giống như Liệt kê 3. Liệt kê 3. Nhận được tờ bảng tính (ExcelReader.java)
// Start by getting the Spreadsheet (Excel books can have several // sheets). Assuming there is just one sheet, it's the zero sheet. HSSFSheet topSheet = excelWB.getSheetAt(0); |
Sau khi có đối tượng tờ, di chuyển trên tờ này và làm việc với dữ liệu của
nó. Các phương thức và các đặc tính có ích như các tên của chúng cho biết
chúng làm gì:
HSSFSheet.getFirstRowNum()
vàgetLastRowNum()
(nhận số hàng đầu và nhận số hàng cuối)HSSFSheet.getHeader()
vàgetFooter()
(nhận tiêu đề và nhận chân trang)HSSFSheet.getRow()
(nhận hàng)HSSFSheet.getPhysicalNumberOfRows()
(nhận số vật lý của hàng)
Để làm việc với dữ liệu trên tờ này, bắt đầu bằng cách nhận một đối tượng
HSSFRow
(org.apache.poi.hssf.usermodel.HSSFRow
), mô tả
một hàng trong tờ đó. Một cách để nhận được một hàng là sử dụng
getRow()
trên tờ đó và yêu cầu số hàng, như
trong Liệt kê 4. Liệt kê 4. Nhận được Hàng (ExcelReader.java)
// getRow() returns an HSSFRow object, but the numbering // system is logical, not physical, and zero based. // for example, use getRow(2) to get the third row. HSSFRow thirdRow = topSheet.getRow(2); |
Hãy nhớ rằng,
topSheet
là tờ bảng tính đã nhận
được trước đó trong Liệt kê 3.
Sau khi có được hàng từ tờ này, hãy sử dụng hàng để truy vấn ngược đến mức
ô.
Các ô
Để đi sâu vào dữ liệu của một ô riêng lẻ, sử dụng hàng này để nhận được một
đối tượng
HSSFCell
(org.apache.poi.hssf.usermodel.HSSFCell
) mô tả
ô đó. Để có được thông tin theo định dạng
String
, sử dụng phương thức
getStringCellValue()
trên
HSSFCell
, như trong Liệt kê
5. Liệt kê 5. Nhận được các ô và các chuỗi bên trong (ExcelReader.java)
// Get the first two cells in the row HSSFCell lastnameCell = thirdRow.getCell(0); HSSFCell firstnameCell = thirdRow.getCell(1); // Get the string information in the cells String firstName = firstnameCell.getStringCellValue(); String lastName = lastnameCell.getStringCellValue(); // Print out the value of the cells System.out.println(firstName + " " + lastName); |
Để thu thập tất cả các thông tin từ bảng tính này, lặp qua tất cả các tờ,
từng hàng trong một tờ, và từng ô trong một hàng. Nhưng có một cách nắm
bắt: Hãy thử chạy đoạn mã dưới đây, và nó làm việc với một số các ô. Tuy
nhiên, nó sẽ thoát ra khi có một lỗi cố trích xuất các giá trị của ô và in
ra (xem nhận xét trong Liệt kê 6). Tại sao?
Liệt kê 6. Vòng lặp qua tất cả các ô và in ra các giá trị. Bị hỏng!
// Traverse the sheets by looping through sheets, rows, and cells. // Remember, excelWB is the workbook object obtained earlier. // Outer Loop: Loop through each sheet for (int sheetNumber = 0; sheetNumber < excelWB.getNumberOfSheets(); sheetNumber++) { HSSFSheet oneSheet = excelWB.getSheetAt(sheetNumber); // Now get the number of rows in the sheet int rows = oneSheet.getPhysicalNumberOfRows(); // Middle Loop: Loop through rows in the sheet for (int rowNumber = 0; rowNumber < rows; rowNumber++) { HSSFRow oneRow = oneSheet.getRow(rowNumber); // Skip empty (null) rows. if (oneRow == null) { continue; } // Get the number of cells in the row int cells = oneRow.getPhysicalNumberOfCells(); // Inner Loop: Loop through each cell in the row for (int cellNumber = 0; cellNumber < cells; cellNumber++) { HSSFCell oneCell = oneRow.getCell(cellNumber); // Get the value of the string in the cell. // Print out the String value of the Cell // This section will result in an error. Why? String cellValue = oneCell.getStringCellValue(); System.out.println(cellValue + ", "); // End Inner Loop } // End Middle Loop } // End Outer Loop } |
Cái gì gây lỗi? Phương thức
getStringCellValue()
chỉ làm việc với
Strings
. Do đó tên này gây ra lỗi.
Một số ô chứa các giá trị số. Để tránh lỗi này, hãy kiểm tra kiểu dữ liệu
của ô và sử dụng phương thức thích hợp để lấy kiểu dữ liệu đó ra khỏi ô.
Sử dụng
getCellType()
để xác định ô này chứa
kiểu dữ liệu nào. Kiểu dữ liệu được trả về là một số nguyên đại diện cho
kiểu dữ liệu này. Các trường tĩnh sau đây (hằng số) mô tả các kiểu dữ
liệu: HSSFCELL.CELL_TYPE_STRING
. Sử dụnggetStringCellValue()
.HSSFCELL.CELL_TYPE_FORMULA
. Sử dụnggetCellFormula()
.HSSFCELL.CELL_TYPE_NUMERIC
. Sử dụnggetNumericCellValue()
.HSSFCELL.CELL_TYPE_BOOLEAN
. Sử dụnggetBooleanCellValue()
.
Ô có lẽ cũng chứa một lỗi Excel. Nếu vậy thì,
getCellType()
trả về toàn bộ
HSSFCELL.CELL_TYPE_ERROR
.
Trong khi lặp qua các ô, hãy kiểm tra các kiểu dữ liệu của chúng, như trong
Liệt kê 7.
Liệt kê 7. Kiểm tra kiểu giá trị ô (ExcelReader.java)
// Inner Loop: Loop through each cell in the row for (int cellNumber = 0; cellNumber < cells; cellNumber++) { HSSFCell oneCell = oneRow.getCell(cellNumber); // Test the value of the cell. // Based on the value type, use the proper // method for working with the value. // If the cell is blank, the cell object is null, so don't // try to use it. It will cause errors. // Use continue to skip it and just keep going. if (oneCell == null) { continue; } switch (oneCell.getCellType()) { case HSSFCell.CELL_TYPE_STRING: System.out.println(oneCell.getStringCellValue()); break; case HSSFCell.CELL_TYPE_FORMULA: System.out.println(oneCell.getCellFormula()); break; case HSSFCell.CELL_TYPE_NUMERIC: System.out.println(oneCell.getNumericCellValue()); break; case HSSFCell.CELL_TYPE_ERROR: System.out.println("Error!"); break; } // End Inner Loop } |
Khi mã chạy, lưu ý rằng các ngày được hiển thị là các số, chứ không phải là
các tên. Đó là do định dạng ngày không được lưu theo giá trị của nó. Đó là
việc lựa chọn định dạng cho ô này. Phần 2 của loạt bài này sẽ thảo luận
cách bảo toàn định dạng cho các ngày.
Một lưu ý quan trọng hơn: Trong các dòng mã sau đây từ Liệt kê 7, được ngắt ra trong Liệt kê 8 dưới
đây, mã kiểm tra từng ô để đảm bảo rằng nó khác không.
Liệt kê 8. Đừng quên kiểm tra ô bằng không (ExcelReader.java)
// If the cell is blank, the cell object is null, so don't // try to use it. It will cause errors. // Use continue to skip it and just keep going. if (oneCell == null) { continue; } |
Trong một môi trường Java, nếu một đối tượng bằng không, việc cố thao tác
nó sẽ gây ra một lỗi. Trước khi sử dụng các đối tượng như các hàng và các
ô, hãy chắc chắn kiểm tra chúng để đảm bảo rằng chúng khác không.
Kết luận
Được trạng bị với những điều cơ bản về đọc các bảng tính Excel, bạn có thể
bắt đầu chuyển đổi dữ liệu Excel vào trong các mảng, XML, hoặc các định
dạng khác để thực hiện các phép tính hoặc tạo ra các bảng tính mới. Phần 2
của loạt bài này sẽ giải thích cách chuyển đổi thông tin bảng tính sang
XML và tạo ra một bảng tính mới có các thay đổi so với dữ liệu gốc.
Khi giải quyết xong mã trong các bài viết này, hãy chắc chắn phục hồi nó để
viết báo cáo xanh hơn.
Tải về
Tài nguyên
Học tập
Tải về
Mô tả | Tên | Kích thước | Phương thức tải |
---|---|---|---|
Sample Excel spreadsheet and Java code | Java-Excel-XML-Planet-Power.zip | 30KB | HTTP |
Tài nguyên
Học tập
- Đọc, phục hồi, sử dụng lại: Báo cáo được thực hiện dễ dàng với Excel, XML, và các công nghệ Java, Phần 2: Chuyển đổi giữa các định dạng báo cáo XML và Excel (Shaene M. Siders, developerworks, 03.2010): Chuyển thông tin trong các bảng tính Excel vào các tài liệu XML được thiết kế rõ ràng để sử dụng lại với nhiều giá trị cài đặt khác nhau trong Phần 2 của loạt bài này của tác giả.
- Có gì sai với các XML API (và làm thế nào để sửa chữa chúng): Xem lại bản trình bày slide của Elliotte Rusty Harold để phát hiện ra một số các khác biệt giữa các kiểu trình phân tích cú pháp XML.
- Các công nghệ XML và Java: Liên kết dữ liệu , Phần 2: Hiệu năng (Dennis Sosnoski, developerWorks, 01.2003): Lấy các khung công tác liên kết dữ liệu XML ra khỏi một ổ đĩa thử nghiệm.
- Java Excel API: Khám phá Excel API này.
- xlSQL Excel JDBC Driver: Khám phá Excel API này.
- OpenXLS: Khám phá Excel API này.
- Tài liệu javadoc cho Apache POI: Duyệt tài liệu hướng dẫn Apache POI.
- Các diễn đàn thảo luận lĩnh vực XML: Tham gia vào bất kỳ các cuộc thảo luận liên quan đến XML nào.
- Chứng chỉ XML của IBM: Tìm hiểu cách bạn có thể trở thành một nhà phát triển có chứng chỉ của IBM về XML và các công nghệ liên quan.
- Thư viện kỹ thuật XML: Xem Vùng XML của developerWorks với một vùng rộng lớn các bài viết kỹ thuật và các lời khuyên, các hướng dẫn, các tiêu chuẩn, và các sách Đỏ của IBM.
- Các sự kiện kỹ thuật và Webcast của developerWorks: Theo sát với công nghệ trong các phiên này.
- developerWorks trên Twitter: Tham gia ngày hôm nay để theo dõi các tin tức của developerWorks.
- developerWorks podcasts: Nghe các cuộc phỏng vấn và thảo luận thú vị dành cho các nhà phát triển phần mềm.
- Eclipse Classic: Tải về Eclipse. Bài viết này sử dụng phiên bản 3.5.1.
- Apache POI: Tìm hiểu thêm và tải về phiên bản 3.6 của Apache POI, là phiên bản ổn định mới nhất.
- Hoàn thành nén tệp cho XOM: Tìm hiểu thêm và tải về XML API của Elliotte Rusty Harold.
- Các phiên bản đánh giá sản phẩm IBM: Tải về hoặc khám phá các bản dùng thử trực tuyến trong Sandbox SOA của IBM và nhận được các công cụ phát triển ứng dụng thực hành của bạn và các sản phẩm phần mềm trung gian từ DB2®, Lotus®, Rational®, Tivoli®, và WebSphere®.
Nguồn IBM
0 comments:
Post a Comment