Posted on 2009-05-30 23:37
啥都寫點 閱讀(282)
評論(0) 編輯 收藏 所屬分類:
J2SE
關鍵技術:
- 一個Excel文檔從大島小可以分成如下幾個要素:工作簿、工作表、行、單元格,在poi的類庫中用不同的類描述。
- org.apache.poi.hssf.usermodel.HSSFWorkbook表示一個Excel文檔。它的createSheet方法為文檔創建新工作表;getSheet方法獲取工作簿的工作表;write方法將文檔對象保存到文件中。
- org.apache.poi.hssf.usermodel.HSSFSheet表示Excel文檔中的--工作表。它的createRow方法為當前工作表創建新行;getRow方法獲得當前工作表的某行。
- org.apache.poi.hssf.usermodel.HSSFRow表示Excel文檔中的行。它的createCell方法為當前行創建一個單元格;getCell方法獲得當前行的某單元格。
- org.apache.poi.hssf.usermodel.HSSFCell表示Excel文檔中的單元格。它的setCellType方法設置單元格的字符類型,如日期類型、數字類型等;setEncoding方法設置單元格的字符編碼方式;setCellStyle方法設置單元格的格式,如字體、居中對齊等;setCellValue方法設置單元格的值。
package book.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.Region;
/**
* 去http://jakarta.apache.org/site/downloads/downloads_poi.cgi下載poi項目相關的jar包和文檔
*/
public class ExcelFile {
/**
* 新建一個Excel文件,里面添加5行5列的內容,再添加兩個高度為2的大單元格。
*
* @param fileName
*/
public void writeExcel(String fileName) {
//目標文件
File file = new File(fileName);
FileOutputStream fOut = null;
try {
// 創建新的Excel 工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
// 在Excel工作簿中建一工作表,其名為缺省值。
// 也可以指定工作表的名字。
HSSFSheet sheet = workbook.createSheet("Test_Table");
// 創建字體,紅色、粗體
HSSFFont font = workbook.createFont();
font.setColor(HSSFFont.COLOR_RED);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
// 創建單元格的格式,如居中、左對齊等
HSSFCellStyle cellStyle = workbook.createCellStyle();
// 水平方向上居中對齊
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 垂直方向上居中對齊
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
// 設置字體
cellStyle.setFont(font);
//下面將建立一個4行3列的表。第一行為表頭。
int rowNum = 0;//行標
int colNum = 0;//列標
//建立表頭信息
// 在索引0的位置創建行(最頂端的行)
HSSFRow row = sheet.createRow((short) rowNum);
// 單元格
HSSFCell cell = null;
for (colNum = 0; colNum < 5; colNum++) {
// 在當前行的colNum列上創建單元格
cell = row.createCell((short) colNum);
// 定義單元格為字符類型,也可以指定為日期類型、數字類型
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
// 定義編碼方式,為了支持中文,這里使用了ENCODING_UTF_16
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
// 為單元格設置格式
cell.setCellStyle(cellStyle);
// 添加內容至單元格
cell.setCellValue("表頭名-" + colNum);
}
rowNum++;
for (; rowNum < 5; rowNum++) {
// 新建第rowNum行
row = sheet.createRow((short) rowNum);
for (colNum = 0; colNum < 5; colNum++) {
// 在當前行的colNum位置創建單元格
cell = row.createCell((short) colNum);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellStyle(cellStyle);
cell.setCellValue("值-" + rowNum + "-" + colNum);
}
}
// 合并單元格
// 先創建2行5列的單元格,然后將這些單元格合并為2個大單元格
rowNum = 5;
for (; rowNum < 7; rowNum++) {
row = sheet.createRow((short) rowNum);
for (colNum = 0; colNum < 5; colNum++) {
// 在當前行的colNum位置創建單元格
cell = row.createCell((short) colNum);
}
}
//建立第一個大單元格,高度為2,寬度為2
rowNum = 5;
colNum = 0;
Region region = new Region(rowNum, (short) colNum, (rowNum + 1),
(short) (colNum + 1));
sheet.addMergedRegion(region);
//獲得第一個大單元格
cell = sheet.getRow(rowNum).getCell((short) colNum);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellStyle(cellStyle);
cell.setCellValue("第一個大單元格");
//建立第二個大單元格,高度為2,寬度為3
colNum = 2;
region = new Region(rowNum, (short) colNum, (rowNum + 1),
(short) (colNum + 2));
sheet.addMergedRegion(region);
//獲得第二個大單元格
cell = sheet.getRow(rowNum).getCell((short) colNum);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellStyle(cellStyle);
cell.setCellValue("第二個大單元格");
// 工作薄建立完成,下面將工作薄存入文件
// 新建一輸出文件流
fOut = new FileOutputStream(file);
// 把相應的Excel 工作簿存盤
workbook.write(fOut);
fOut.flush();
// 操作結束,關閉文件
fOut.close();
System.out
.println("Excel文件生成成功!Excel文件名:" + file.getAbsolutePath());
} catch (Exception e) {
System.out.println("Excel文件" + file.getAbsolutePath() + "生成失敗:" + e);
} finally {
if (fOut != null){
try {
fOut.close();
} catch (IOException e1) {
}
}
}
}
/**
* 讀Excel文件內容
*
* @param fileName
*/
public void readExcel(String fileName) {
File file = new File(fileName);
FileInputStream in = null;
try {
// 創建對Excel工作簿文件的引用
in = new FileInputStream(file);
HSSFWorkbook workbook = new HSSFWorkbook(in);
// 創建對工作表的引用。
// 這里使用按名引用
HSSFSheet sheet = workbook.getSheet("Test_Table");
// 也可用getSheetAt(int index)按索引引用,
// 在Excel文檔中,第一張工作表的缺省索引是0,其語句為:
// HSSFSheet sheet = workbook.getSheetAt(0);
//下面讀取Excel的前5行的數據
System.out.println("下面是Excel文件" + file.getAbsolutePath() + "的內容:");
HSSFRow row = null;
HSSFCell cell = null;
int rowNum = 0;//行標
int colNum = 0;//列標
for (; rowNum < 5; rowNum++) {
// 獲取第rowNum行
row = sheet.getRow((short) rowNum);
for (colNum = 0; colNum < 5; colNum++) {
// 獲取當前行的colNum位置的單元格
cell = row.getCell((short) colNum);
System.out.print(cell.getStringCellValue() + "\t");
}
//換行
System.out.println();
}
in.close();
} catch (Exception e) {
System.out.println("讀取Excel文件" + file.getAbsolutePath() + "失敗:" + e);
} finally {
if (in != null){
try {
in.close();
} catch (IOException e1) {
}
}
}
}
public static void main(String[] args) throws Exception {
ExcelFile excel = new ExcelFile();
String fileName = "c:/temp/temp.xls";
excel.writeExcel(fileName);
excel.readExcel(fileName);
}
}
--
學海無涯