Đọc, phục hồi và sử dụng lại: Báo cáo được tạo dễ dàng với Excel, XML và các công nghệ Java, Phần 1

Đọc các tệp Excel và viết chúng vào các tệp mới bằng các công nghệ Java và XML

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™.

Shaene M Siders, Tác giả và nhà tư vấn, Dragon Under Glass

Shaene Siders là một nhà tư vấn và người viết về công nghệ, đào tạo và giải trí. Cô đã thành lập một công ty phát triển web và viết sách vào năm 1996 và đã là Trợ giáo có chứng chỉ Rational của IBM về ClearCase và ClearQuest (IBM Rational Certified Instructor ClearCase và ClearQuest) kể từ năm 2003. Cô là tác giả và nhà sản xuất loạt phần mềm tin học dành cho đào tạo Java for Mad Scientists, (Java cho các nhà khoa học say mê) và cô cũng là một Trợ giáo có chứng chỉ Rational của IBM về Build Forge, Rational Functional Tester, Rational Performance Tester và Rational Manual Tester. Bạn có thể liên lạc với Shaene tại consult@DragonUnderGlass.com.



02 03 2010 (Xuất bản lần đầu tiên vào ngày 28 11 2011)

02.03.2010 Đã thêm các liên kết cho Phần 2 trong các mục Ứng dụng mẫu, Kết luận, và Tài nguyên

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.

Các từ viết tắt thông dụng

  • API: Giao diện lập trình ứng dụng
  • GUI: Giao diện người dùng đồ họa
  • IDE: Môi trường phát triển tích hợp
  • PNG: Các đồ họa mạng di động
  • SQL: Ngôn ngữ truy vấn có cấu trúc
  • XML: Ngôn ngữ đánh dấu mở rộng

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ác công cụ được sử dụng trong bài viết này

Để làm việc với các ví dụ trong bài viết này, bạn cần những công cụ sau đây:

  • API mô hình đối tượng XML (XOM) phiên bản 1.2.1.
  • Apache POI phiên bản 3.6, Java API cho các tài liệu Microsoft Office.
  • Eclipse Classic phiên bản 3.5.1 (IDE với Nền tảng Java, Ấn bản chuẩn [Java SE ] phiên bản 6 được gắn kèm).
  • Microsoft Excel

Để biết thêm thông tin và các liên kết tới các sản phẩm này, xem Tài nguyên.

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:

  1. Tải về bảng tính Excel và mã mẫu.
  2. Tạo thư mục C:\Planet Power, và trích xuất các tệp vào nó.
  3. 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.
  4. 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.
  5. 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:

  1. 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.
  2. 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.
  3. 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 chụp màn hình biểu tượng Workbench
  4. 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).
  5. 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
    Đặt một dự án hiện có vào trong vùng làm việc, ảnh chụp màn hình của hộp thoại Import, tùy chọn Select
  6. 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.
  7. Nhấn Finish (Kết thúc), như trong Hình 3.
    Hình 3. Nhập một dự án vào Eclipse
    Nhập một dự án vào Eclipse, ảnh chụp màn hình của hộp thoại Import, tùy chọn Import Projects

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:

  1. 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).
  2. Nhấn Java Build Path (Đường dẫn xây dựng Java) ở ô bên trái.
  3. Nhấn thẻ Libraries (Các thư viện).
  4. 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
    Thêm đường dẫn xây dựng, ảnh chụp màn hình của hộp thoại Properties for Employees
  5. 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ở).
  6. Nhấn lại Add External JARs.
  7. 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.
  8. 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
Ảnh chụp màn hình của tệp ExcelReader.java mở trong Eclipse SDK

Để 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
Ảnh chụp màn hình cho thấy mũi tên Run trong thanh công cụ của Eclipse SDKr

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
Ảnh chụp màn hình của thẻ Console khi chạy ExcelReader.java trong Eclipse SDK

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?

Một số lớp để đọc các bảng tính Excel

Dưới đây là một vài lớp được sử dụng để đọc các bảng tính Excel:

  • java.io.FileInputStream
  • java.io.IOException
  • org.apache.poi.hssf.usermodel.HSSFWorkbook
  • org.apache.poi.hssf.usermodel.HSSFSheet
  • org.apache.poi.hssf.usermodel.HSSFRow
  • org.apache.poi.hssf.usermodel.HSSFCell

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.

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()getLastRowNum() (nhận số hàng đầu và nhận số hàng cuối)
  • HSSFSheet.getHeader()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ụng getStringCellValue().
  • HSSFCELL.CELL_TYPE_FORMULA. Sử dụng getCellFormula().
  • HSSFCELL.CELL_TYPE_NUMERIC. Sử dụng getNumericCellValue().
  • HSSFCELL.CELL_TYPE_BOOLEAN. Sử dụng getBooleanCellValue().

Ô 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ề

Mô tảTênKích thước
Sample Excel spreadsheet and Java codeJava-Excel-XML-Planet-Power.zip30KB

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Công nghệ Java
ArticleID=776940
ArticleTitle=Đọc, phục hồi và sử dụng lại: Báo cáo được tạo dễ dàng với Excel, XML và các công nghệ Java, Phần 1
publish-date=03022010