POI3的資料整理

王明輝發表於2017-09-28

轉自http://aman.cao.blog.163.com/blog/static/32951336201010823557408/

POI3的資料整理
一.POI簡介 

Jakarta POI 是apache的子專案,目標是處理ole2物件。它提供了一組操縱Windows文件的Java API 

目前比較成熟的是HSSF介面,處理MS Excel(97-2002)物件。它不象我們僅僅是用csv生成的沒有格式的可以由Excel轉換的東西,而是真正的Excel物件,你可以控制一些屬性如sheet,cell等等。 

二.HSSF概況 

HSSF 是Horrible SpreadSheet Format的縮寫,也即“討厭的電子表格格式”。 也許HSSF的名字有點滑稽,就本質而言它是一個非常嚴肅、正規的API。通過HSSF,你可以用純Java程式碼來讀取、寫入、修改Excel檔案。 

HSSF 為讀取操作提供了兩類API:usermodel和eventusermodel,即“使用者模型”和“事件-使用者模型”。前者很好理解,後者比較抽象,但操作效率要高得多。 

三.開始編碼 

1 . 準備工作 

要求:JDK 1.4+POI開發包 

可以到 http://www.apache.org/dyn/closer.cgi/jakarta/poi/ 最新的POI工具包 

2 . EXCEL 結構 

HSSFWorkbook excell 文件物件介紹 
HSSFSheet excell的表單 
HSSFRow excell的行 
HSSFCell excell的格子單元 
HSSFFont excell字型 
HSSFName 名稱 
HSSFDataFormat 日期格式 
HSSFHeader sheet頭 
HSSFFooter sheet尾 
和這個樣式 
HSSFCellStyle cell樣式 
輔助操作包括 
HSSFDateUtil 日期 
HSSFPrintSetup 列印 
HSSFErrorConstants 錯誤資訊表 

4 . 可參考文件 

POI 主頁:http://jakarta.apache.org/poi/, 

初學者如何快速上手使用POI HSSF 

http://jakarta.apache.org/poi/hssf/quick-guide.html 。 

程式碼例子 http://blog.java-cn.com/user1/6749/archives/2005/18347.html 


裡面有很多例子程式碼,可以很方便上手。 

四.使用心得 

POI HSSF 的usermodel包把Excel檔案對映成我們熟悉的結構,諸如Workbook、Sheet、Row、Cell等,它把整個結構以一組物件的形式儲存在記憶體之中,便於理解,操作方便,基本上能夠滿足我們的要求,所以說這個一個不錯的選擇。 

1.建立工作簿 (WORKBOOK) 
Java程式碼 
HSSFWorkbook wb = new HSSFWorkbook();    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   

HSSFWorkbook wb = new HSSFWorkbook(); 
FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 
wb.write(fileOut); 
fileOut.close(); 

2.建立工作表(SHEET) 
Java程式碼 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet1 = wb.createSheet("new sheet");    
HSSFSheet sheet2 = wb.createSheet("second sheet");    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   

HSSFWorkbook wb = new HSSFWorkbook(); 
HSSFSheet sheet1 = wb.createSheet("new sheet"); 
HSSFSheet sheet2 = wb.createSheet("second sheet"); 
FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 
wb.write(fileOut); 
fileOut.close(); 

3.建立單元格(CELL) 
Java程式碼 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("new sheet");    
// Create a row and put some cells in it. Rows are 0 based.    
HSSFRow row = sheet.createRow((short)0);    
// Create a cell and put a value in it.    
HSSFCell cell = row.createCell((short)0);    
cell.setCellValue(1);    
// Or do it on one line.    
row.createCell((short)1).setCellValue(1.2);    
row.createCell((short)2).setCellValue("This is a string");    
row.createCell((short)3).setCellValue(true);    
// Write the output to a file    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   

HSSFWorkbook wb = new HSSFWorkbook(); 
HSSFSheet sheet = wb.createSheet("new sheet"); 
// Create a row and put some cells in it. Rows are 0 based. 
HSSFRow row = sheet.createRow((short)0); 
// Create a cell and put a value in it. 
HSSFCell cell = row.createCell((short)0); 
cell.setCellValue(1); 
// Or do it on one line. 
row.createCell((short)1).setCellValue(1.2); 
row.createCell((short)2).setCellValue("This is a string"); 
row.createCell((short)3).setCellValue(true); 
// Write the output to a file 
FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 
wb.write(fileOut); 
fileOut.close(); 4 

4.建立指定單元格式的單元格 
Java程式碼 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("new sheet");    
// Create a row and put some cells in it. Rows are 0 based.    
HSSFRow row = sheet.createRow((short)0);    
// Create a cell and put a date value in it. The first cell is not styled    
// as a date.    
HSSFCell cell = row.createCell((short)0);    
cell.setCellValue(new Date());    
// we style the second cell as a date (and time). It is important to    
// create a new cell style from the workbook otherwise you can end up    
// modifying the built in style and effecting not only this cell but other cells.    
HSSFCellStyle cellStyle = wb.createCellStyle();    
cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));    
cell = row.createCell((short)1);    
cell.setCellValue(new Date());    
cell.setCellStyle(cellStyle);    
// Write the output to a file    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   

HSSFWorkbook wb = new HSSFWorkbook(); 
HSSFSheet sheet = wb.createSheet("new sheet"); 
// Create a row and put some cells in it. Rows are 0 based. 
HSSFRow row = sheet.createRow((short)0); 
// Create a cell and put a date value in it. The first cell is not styled 
// as a date. 
HSSFCell cell = row.createCell((short)0); 
cell.setCellValue(new Date()); 
// we style the second cell as a date (and time). It is important to 
// create a new cell style from the workbook otherwise you can end up 
// modifying the built in style and effecting not only this cell but other cells. 
HSSFCellStyle cellStyle = wb.createCellStyle(); 
cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm")); 
cell = row.createCell((short)1); 
cell.setCellValue(new Date()); 
cell.setCellStyle(cellStyle); 
// Write the output to a file 
FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 
wb.write(fileOut); 
fileOut.close(); 

5. 單元格的不同格式 
Java程式碼 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("new sheet");    
HSSFRow row = sheet.createRow((short)2);    
row.createCell((short) 0).setCellValue(1.1);    
row.createCell((short) 1).setCellValue(new Date());    
row.createCell((short) 2).setCellValue("a string");    
row.createCell((short) 3).setCellValue(true);    
row.createCell((short) 4).setCellType(HSSFCell.CELL_TYPE_ERROR);    
// Write the output to a file    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   

HSSFWorkbook wb = new HSSFWorkbook(); 
HSSFSheet sheet = wb.createSheet("new sheet"); 
HSSFRow row = sheet.createRow((short)2); 
row.createCell((short) 0).setCellValue(1.1); 
row.createCell((short) 1).setCellValue(new Date()); 
row.createCell((short) 2).setCellValue("a string"); 
row.createCell((short) 3).setCellValue(true); 
row.createCell((short) 4).setCellType(HSSFCell.CELL_TYPE_ERROR); 
// Write the output to a file 
FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 
wb.write(fileOut); 
fileOut.close(); 

6.單元格的不通對齊方式 
Java程式碼 
public static void main(String[] args)    
throws IOException    
{    
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("new sheet");    
HSSFRow row = sheet.createRow((short) 2);    
createCell(wb, row, (short) 0, HSSFCellStyle.ALIGN_CENTER);    
createCell(wb, row, (short) 1, HSSFCellStyle.ALIGN_CENTER_SELECTION);    
createCell(wb, row, (short) 2, HSSFCellStyle.ALIGN_FILL);    
createCell(wb, row, (short) 3, HSSFCellStyle.ALIGN_GENERAL);    
createCell(wb, row, (short) 4, HSSFCellStyle.ALIGN_JUSTIFY);    
createCell(wb, row, (short) 5, HSSFCellStyle.ALIGN_LEFT);    
createCell(wb, row, (short) 6, HSSFCellStyle.ALIGN_RIGHT);    
// Write the output to a file    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();    
}    
/**   
* Creates a cell and aligns it a certain way.   
*   
* @param wb the workbook   
* @param row the row to create the cell in   
* @param column the column number to create the cell in   
* @param align the alignment for the cell.   
*/    
private static void createCell(HSSFWorkbook wb, HSSFRow row, short column, short align)    
{    
HSSFCell cell = row.createCell(column);    
cell.setCellValue("Align It");    
HSSFCellStyle cellStyle = wb.createCellStyle();    
cellStyle.setAlignment(align);    
cell.setCellStyle(cellStyle);    
}   

public static void main(String[] args) 
throws IOException 

HSSFWorkbook wb = new HSSFWorkbook(); 
HSSFSheet sheet = wb.createSheet("new sheet"); 
HSSFRow row = sheet.createRow((short) 2); 
createCell(wb, row, (short) 0, HSSFCellStyle.ALIGN_CENTER); 
createCell(wb, row, (short) 1, HSSFCellStyle.ALIGN_CENTER_SELECTION); 
createCell(wb, row, (short) 2, HSSFCellStyle.ALIGN_FILL); 
createCell(wb, row, (short) 3, HSSFCellStyle.ALIGN_GENERAL); 
createCell(wb, row, (short) 4, HSSFCellStyle.ALIGN_JUSTIFY); 
createCell(wb, row, (short) 5, HSSFCellStyle.ALIGN_LEFT); 
createCell(wb, row, (short) 6, HSSFCellStyle.ALIGN_RIGHT); 
// Write the output to a file 
FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 
wb.write(fileOut); 
fileOut.close(); 

/** 
* Creates a cell and aligns it a certain way. 

* @param wb the workbook 
* @param row the row to create the cell in 
* @param column the column number to create the cell in 
* @param align the alignment for the cell. 
*/ 
private static void createCell(HSSFWorkbook wb, HSSFRow row, short column, short align) 

HSSFCell cell = row.createCell(column); 
cell.setCellValue("Align It"); 
HSSFCellStyle cellStyle = wb.createCellStyle(); 
cellStyle.setAlignment(align); 
cell.setCellStyle(cellStyle); 


7.單元格的邊框設定 
Java程式碼 
//Working with borders    
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("new sheet");    
// Create a row and put some cells in it. Rows are 0 based.    
HSSFRow row = sheet.createRow((short) 1);    
// Create a cell and put a value in it.    
HSSFCell cell = row.createCell((short) 1);    
cell.setCellValue(4);    
// Style the cell with borders all around.    
HSSFCellStyle style = wb.createCellStyle();    
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);    
style.setBottomBorderColor(HSSFColor.BLACK.index);    
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);    
style.setLeftBorderColor(HSSFColor.GREEN.index);    
style.setBorderRight(HSSFCellStyle.BORDER_THIN);    
style.setRightBorderColor(HSSFColor.BLUE.index);    
style.setBorderTop(HSSFCellStyle.BORDER_MEDIUM_DASHED);    
style.setTopBorderColor(HSSFColor.BLACK.index);    
cell.setCellStyle(style);    
// Write the output to a file    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   

//Working with borders 
HSSFWorkbook wb = new HSSFWorkbook(); 
HSSFSheet sheet = wb.createSheet("new sheet"); 
// Create a row and put some cells in it. Rows are 0 based. 
HSSFRow row = sheet.createRow((short) 1); 
// Create a cell and put a value in it. 
HSSFCell cell = row.createCell((short) 1); 
cell.setCellValue(4); 
// Style the cell with borders all around. 
HSSFCellStyle style = wb.createCellStyle(); 
style.setBorderBottom(HSSFCellStyle.BORDER_THIN); 
style.setBottomBorderColor(HSSFColor.BLACK.index); 
style.setBorderLeft(HSSFCellStyle.BORDER_THIN); 
style.setLeftBorderColor(HSSFColor.GREEN.index); 
style.setBorderRight(HSSFCellStyle.BORDER_THIN); 
style.setRightBorderColor(HSSFColor.BLUE.index); 
style.setBorderTop(HSSFCellStyle.BORDER_MEDIUM_DASHED); 
style.setTopBorderColor(HSSFColor.BLACK.index); 
cell.setCellStyle(style); 
// Write the output to a file 
FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 
wb.write(fileOut); 
fileOut.close(); 

8.填充和顏色設定 
Java程式碼 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("new sheet");    
// Create a row and put some cells in it. Rows are 0 based.    
HSSFRow row = sheet.createRow((short) 1);    
// Aqua background    
HSSFCellStyle style = wb.createCellStyle();    
style.setFillBackgroundColor(HSSFColor.AQUA.index);    
style.setFillPattern(HSSFCellStyle.BIG_SPOTS);    
HSSFCell cell = row.createCell((short) 1);    
cell.setCellValue("X");    
cell.setCellStyle(style);    
// Orange "foreground", foreground being the fill foreground not the font color.    
style = wb.createCellStyle();    
style.setFillForegroundColor(HSSFColor.ORANGE.index);    
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);    
cell = row.createCell((short) 2);    
cell.setCellValue("X");    
cell.setCellStyle(style);    
// Write the output to a file    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   

HSSFWorkbook wb = new HSSFWorkbook(); 
HSSFSheet sheet = wb.createSheet("new sheet"); 
// Create a row and put some cells in it. Rows are 0 based. 
HSSFRow row = sheet.createRow((short) 1); 
// Aqua background 
HSSFCellStyle style = wb.createCellStyle(); 
style.setFillBackgroundColor(HSSFColor.AQUA.index); 
style.setFillPattern(HSSFCellStyle.BIG_SPOTS); 
HSSFCell cell = row.createCell((short) 1); 
cell.setCellValue("X"); 
cell.setCellStyle(style); 
// Orange "foreground", foreground being the fill foreground not the font color. 
style = wb.createCellStyle(); 
style.setFillForegroundColor(HSSFColor.ORANGE.index); 
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 
cell = row.createCell((short) 2); 
cell.setCellValue("X"); 
cell.setCellStyle(style); 
// Write the output to a file 
FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 
wb.write(fileOut); 
fileOut.close(); 

9.合併單元格操作 
Java程式碼 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("new sheet");    
HSSFRow row = sheet.createRow((short) 1);    
HSSFCell cell = row.createCell((short) 1);    
cell.setCellValue("This is a test of merging");    
sheet.addMergedRegion(new Region(1,(short)1,1,(short)2));    
// Write the output to a file    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   

HSSFWorkbook wb = new HSSFWorkbook(); 
HSSFSheet sheet = wb.createSheet("new sheet"); 
HSSFRow row = sheet.createRow((short) 1); 
HSSFCell cell = row.createCell((short) 1); 
cell.setCellValue("This is a test of merging"); 
sheet.addMergedRegion(new Region(1,(short)1,1,(short)2)); 
// Write the output to a file 
FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 
wb.write(fileOut); 
fileOut.close(); 
9.1合併單元格邊框的解決辦法 
Java程式碼 
private void setRegionStyle(HSSFSheet sheet, Region region , HSSFCellStyle cs) {   
       int toprowNum = region.getRowFrom();   
       for (int i = region.getRowFrom(); i <= region.getRowTo(); i ++) {   
           HSSFRow row = HSSFCellUtil.getRow(i, sheet);   
           for (int j = region.getColumnFrom(); j <= region.getColumnTo(); j++) {   
               HSSFCell cell = HSSFCellUtil.getCell(row, (short)j);   
               cell.setCellStyle(cs);   
           }   
       }   
}  

 private void setRegionStyle(HSSFSheet sheet, Region region , HSSFCellStyle cs) {
        int toprowNum = region.getRowFrom();
        for (int i = region.getRowFrom(); i <= region.getRowTo(); i ++) {
            HSSFRow row = HSSFCellUtil.getRow(i, sheet);
            for (int j = region.getColumnFrom(); j <= region.getColumnTo(); j++) {
                HSSFCell cell = HSSFCellUtil.getCell(row, (short)j);
                cell.setCellStyle(cs);
            }
        }
 }

10.字型設定 
Java程式碼 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("new sheet");    
// Create a row and put some cells in it. Rows are 0 based.    
HSSFRow row = sheet.createRow((short) 1);    
// Create a new font and alter it.    
HSSFFont font = wb.createFont();    
font.setFontHeightInPoints((short)24);    
font.setFontName("Courier New");    
font.setItalic(true);    
font.setStrikeout(true);    
// Fonts are set into a style so create a new one to use.    
HSSFCellStyle style = wb.createCellStyle();    
style.setFont(font);    
// Create a cell and put a value in it.    
HSSFCell cell = row.createCell((short) 1);    
cell.setCellValue("This is a test of fonts");    
cell.setCellStyle(style);    
// Write the output to a file    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   

HSSFWorkbook wb = new HSSFWorkbook(); 
HSSFSheet sheet = wb.createSheet("new sheet"); 
// Create a row and put some cells in it. Rows are 0 based. 
HSSFRow row = sheet.createRow((short) 1); 
// Create a new font and alter it. 
HSSFFont font = wb.createFont(); 
font.setFontHeightInPoints((short)24); 
font.setFontName("Courier New"); 
font.setItalic(true); 
font.setStrikeout(true); 
// Fonts are set into a style so create a new one to use. 
HSSFCellStyle style = wb.createCellStyle(); 
style.setFont(font); 
// Create a cell and put a value in it. 
HSSFCell cell = row.createCell((short) 1); 
cell.setCellValue("This is a test of fonts"); 
cell.setCellStyle(style); 
// Write the output to a file 
FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 
wb.write(fileOut); 
fileOut.close(); 

11.自定義顏色 
Java程式碼 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet();    
HSSFRow row = sheet.createRow((short) 0);    
HSSFCell cell = row.createCell((short) 0);    
cell.setCellValue("Default Palette");    
//apply some colors from the standard palette,    
// as in the previous examples.    
//we'll use red text on a lime background    
HSSFCellStyle style = wb.createCellStyle();    
style.setFillForegroundColor(HSSFColor.LIME.index);    
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);    
HSSFFont font = wb.createFont();    
font.setColor(HSSFColor.RED.index);    
style.setFont(font);    
cell.setCellStyle(style);    
//save with the default palette    
FileOutputStream out = new FileOutputStream("default_palette.xls");    
wb.write(out);    
out.close();    
//now, let's replace RED and LIME in the palette    
// with a more attractive combination    
// (lovingly borrowed from freebsd.org)    
cell.setCellValue("Modified Palette");    
//creating a custom palette for the workbook    
HSSFPalette palette = wb.getCustomPalette();    
//replacing the standard red with freebsd.org red    
palette.setColorAtIndex(HSSFColor.RED.index,    
(byte) 153, //RGB red (0-255)    
(byte) 0, //RGB green    
(byte) 0 //RGB blue    
);    
//replacing lime with freebsd.org gold    
palette.setColorAtIndex(HSSFColor.LIME.index, (byte) 255, (byte) 204, (byte) 102);    
//save with the modified palette    
// note that wherever we have previously used RED or LIME, the    
// new colors magically appear    
out = new FileOutputStream("modified_palette.xls");    
wb.write(out);    
out.close();   

HSSFWorkbook wb = new HSSFWorkbook(); 
HSSFSheet sheet = wb.createSheet(); 
HSSFRow row = sheet.createRow((short) 0); 
HSSFCell cell = row.createCell((short) 0); 
cell.setCellValue("Default Palette"); 
//apply some colors from the standard palette, 
// as in the previous examples. 
//we'll use red text on a lime background 
HSSFCellStyle style = wb.createCellStyle(); 
style.setFillForegroundColor(HSSFColor.LIME.index); 
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 
HSSFFont font = wb.createFont(); 
font.setColor(HSSFColor.RED.index); 
style.setFont(font); 
cell.setCellStyle(style); 
//save with the default palette 
FileOutputStream out = new FileOutputStream("default_palette.xls"); 
wb.write(out); 
out.close(); 
//now, let's replace RED and LIME in the palette 
// with a more attractive combination 
// (lovingly borrowed from freebsd.org) 
cell.setCellValue("Modified Palette"); 
//creating a custom palette for the workbook 
HSSFPalette palette = wb.getCustomPalette(); 
//replacing the standard red with freebsd.org red 
palette.setColorAtIndex(HSSFColor.RED.index, 
(byte) 153, //RGB red (0-255) 
(byte) 0, //RGB green 
(byte) 0 //RGB blue 
); 
//replacing lime with freebsd.org gold 
palette.setColorAtIndex(HSSFColor.LIME.index, (byte) 255, (byte) 204, (byte) 102); 
//save with the modified palette 
// note that wherever we have previously used RED or LIME, the 
// new colors magically appear 
out = new FileOutputStream("modified_palette.xls"); 
wb.write(out); 
out.close(); 


12.讀和重寫EXCEL檔案 
Java程式碼 
POIFSFileSystem fs =    
new POIFSFileSystem(new FileInputStream("workbook.xls"));    
HSSFWorkbook wb = new HSSFWorkbook(fs);    
HSSFSheet sheet = wb.getSheetAt(0);    
HSSFRow row = sheet.getRow(2);    
HSSFCell cell = row.getCell((short)3);    
if (cell == null)    
cell = row.createCell((short)3);    
cell.setCellType(HSSFCell.CELL_TYPE_STRING);    
cell.setCellValue("a test");    
// Write the output to a file    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   

POIFSFileSystem fs = 
new POIFSFileSystem(new FileInputStream("workbook.xls")); 
HSSFWorkbook wb = new HSSFWorkbook(fs); 
HSSFSheet sheet = wb.getSheetAt(0); 
HSSFRow row = sheet.getRow(2); 
HSSFCell cell = row.getCell((short)3); 
if (cell == null) 
cell = row.createCell((short)3); 
cell.setCellType(HSSFCell.CELL_TYPE_STRING); 
cell.setCellValue("a test"); 
// Write the output to a file 
FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 
wb.write(fileOut); 
fileOut.close(); 

13.在EXCEL單元格中使用自動換行 
Java程式碼 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet s = wb.createSheet();    
HSSFRow r = null;    
HSSFCell c = null;    
HSSFCellStyle cs = wb.createCellStyle();    
HSSFFont f = wb.createFont();    
HSSFFont f2 = wb.createFont();    
cs = wb.createCellStyle();    
cs.setFont( f2 );    
//Word Wrap MUST be turned on    
cs.setWrapText( true );    
r = s.createRow( (short) 2 );    
r.setHeight( (short) 0x349 );    
c = r.createCell( (short) 2 );    
c.setCellType( HSSFCell.CELL_TYPE_STRING );    
c.setCellValue( "Use \n with word wrap on to create a new line" );    
c.setCellStyle( cs );    
s.setColumnWidth( (short) 2, (short) ( ( 50 * 8 ) / ( (double) 1 / 20 ) ) );    
FileOutputStream fileOut = new FileOutputStream( "workbook.xls" );    
wb.write( fileOut );    
fileOut.close();  

HSSFWorkbook wb = new HSSFWorkbook(); 
HSSFSheet s = wb.createSheet(); 
HSSFRow r = null; 
HSSFCell c = null; 
HSSFCellStyle cs = wb.createCellStyle(); 
HSSFFont f = wb.createFont(); 
HSSFFont f2 = wb.createFont(); 
cs = wb.createCellStyle(); 
cs.setFont( f2 ); 
//Word Wrap MUST be turned on 
cs.setWrapText( true ); 
r = s.createRow( (short) 2 ); 
r.setHeight( (short) 0x349 ); 
c = r.createCell( (short) 2 ); 
c.setCellType( HSSFCell.CELL_TYPE_STRING ); 
c.setCellValue( "Use \n with word wrap on to create a new line" ); 
c.setCellStyle( cs ); 
s.setColumnWidth( (short) 2, (short) ( ( 50 * 8 ) / ( (double) 1 / 20 ) ) ); 
FileOutputStream fileOut = new FileOutputStream( "workbook.xls" ); 
wb.write( fileOut ); 
fileOut.close();

14.數字格式自定義 
Java程式碼 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("format sheet");    
HSSFCellStyle style;    
HSSFDataFormat format = wb.createDataFormat();    
HSSFRow row;    
HSSFCell cell;    
short rowNum = 0;    
short colNum = 0;    
row = sheet.createRow(rowNum++);    
cell = row.createCell(colNum);    
cell.setCellValue(11111.25);    
style = wb.createCellStyle();    
style.setDataFormat(format.getFormat("0.0"));    
cell.setCellStyle(style);    
row = sheet.createRow(rowNum++);    
cell = row.createCell(colNum);    
cell.setCellValue(11111.25);    
style = wb.createCellStyle();    
style.setDataFormat(format.getFormat("#,##0.0000"));    
cell.setCellStyle(style);    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   

HSSFWorkbook wb = new HSSFWorkbook(); 
HSSFSheet sheet = wb.createSheet("format sheet"); 
HSSFCellStyle style; 
HSSFDataFormat format = wb.createDataFormat(); 
HSSFRow row; 
HSSFCell cell; 
short rowNum = 0; 
short colNum = 0; 
row = sheet.createRow(rowNum++); 
cell = row.createCell(colNum); 
cell.setCellValue(11111.25); 
style = wb.createCellStyle(); 
style.setDataFormat(format.getFormat("0.0")); 
cell.setCellStyle(style); 
row = sheet.createRow(rowNum++); 
cell = row.createCell(colNum); 
cell.setCellValue(11111.25); 
style = wb.createCellStyle(); 
style.setDataFormat(format.getFormat("#,##0.0000")); 
cell.setCellStyle(style); 
FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 
wb.write(fileOut); 
fileOut.close(); 

15.調整工作單位置 
Java程式碼 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("format sheet");    
HSSFPrintSetup ps = sheet.getPrintSetup();    
sheet.setAutobreaks(true);    
ps.setFitHeight((short)1);    
ps.setFitWidth((short)1); // Create various cells and rows for spreadsheet.    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   

HSSFWorkbook wb = new HSSFWorkbook(); 
HSSFSheet sheet = wb.createSheet("format sheet"); 
HSSFPrintSetup ps = sheet.getPrintSetup(); 
sheet.setAutobreaks(true); 
ps.setFitHeight((short)1); 
ps.setFitWidth((short)1); // Create various cells and rows for spreadsheet. 
FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 
wb.write(fileOut); 
fileOut.close(); 


16.設定列印區域 
Java程式碼 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("Sheet1");    
wb.setPrintArea(0, "$A$1:$C$2");    
//sets the print area for the first sheet    
//Alternatively:    
//wb.setPrintArea(0, 0, 1, 0, 0) is equivalent to using the name reference (See the JavaDocs for more details)    
// Create various cells and rows for spreadsheet.    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   

HSSFWorkbook wb = new HSSFWorkbook(); 
HSSFSheet sheet = wb.createSheet("Sheet1"); 
wb.setPrintArea(0, "$A$1:$C$2"); 
//sets the print area for the first sheet 
//Alternatively: 
//wb.setPrintArea(0, 0, 1, 0, 0) is equivalent to using the name reference (See the JavaDocs for more details) 
// Create various cells and rows for spreadsheet. 
FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 
wb.write(fileOut); 
fileOut.close(); 

17.標註腳註 
Java程式碼 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("format sheet");    
HSSFFooter footer = sheet.getFooter()    
footer.setRight( "Page " + HSSFFooter.page() + " of " + HSSFFooter.numPages() );    
  
// Create various cells and rows for spreadsheet.    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   

HSSFWorkbook wb = new HSSFWorkbook(); 
HSSFSheet sheet = wb.createSheet("format sheet"); 
HSSFFooter footer = sheet.getFooter() 
footer.setRight( "Page " + HSSFFooter.page() + " of " + HSSFFooter.numPages() ); 

// Create various cells and rows for spreadsheet. 
FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 
wb.write(fileOut); 
fileOut.close(); 

18.使用方便的內部提供的函式 
Java程式碼 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet1 = wb.createSheet( "new sheet" );    
// Create a merged region    
HSSFRow row = sheet1.createRow( (short) 1 );    
HSSFRow row2 = sheet1.createRow( (short) 2 );    
HSSFCell cell = row.createCell( (short) 1 );    
cell.setCellValue( "This is a test of merging" );    
Region region = new Region( 1, (short) 1, 4, (short) 4 );    
sheet1.addMergedRegion( region );    
// Set the border and border colors.    
final short borderMediumDashed = HSSFCellStyle.BORDER_MEDIUM_DASHED;    
HSSFRegionUtil.setBorderBottom( borderMediumDashed,    
region, sheet1, wb );    
HSSFRegionUtil.setBorderTop( borderMediumDashed,    
region, sheet1, wb );    
HSSFRegionUtil.setBorderLeft( borderMediumDashed,    
region, sheet1, wb );    
HSSFRegionUtil.setBorderRight( borderMediumDashed,    
region, sheet1, wb );    
HSSFRegionUtil.setBottomBorderColor(HSSFColor.AQUA.index, region, sheet1, wb);    
HSSFRegionUtil.setTopBorderColor(HSSFColor.AQUA.index, region, sheet1, wb);    
HSSFRegionUtil.setLeftBorderColor(HSSFColor.AQUA.index, region, sheet1, wb);    
HSSFRegionUtil.setRightBorderColor(HSSFColor.AQUA.index, region, sheet1, wb);    
// Shows some usages of HSSFCellUtil    
HSSFCellStyle style = wb.createCellStyle();    
style.setIndention((short)4);    
HSSFCellUtil.createCell(row, 8, "This is the value of the cell", style);    
HSSFCell cell2 = HSSFCellUtil.createCell( row2, 8, "This is the value of the cell");    
HSSFCellUtil.setAlignment(cell2, wb, HSSFCellStyle.ALIGN_CENTER);    
// Write out the workbook    
FileOutputStream fileOut = new FileOutputStream( "workbook.xls" );    
wb.write( fileOut );    
fileOut.close();   

HSSFWorkbook wb = new HSSFWorkbook(); 
HSSFSheet sheet1 = wb.createSheet( "new sheet" ); 
// Create a merged region 
HSSFRow row = sheet1.createRow( (short) 1 ); 
HSSFRow row2 = sheet1.createRow( (short) 2 ); 
HSSFCell cell = row.createCell( (short) 1 ); 
cell.setCellValue( "This is a test of merging" ); 
Region region = new Region( 1, (short) 1, 4, (short) 4 ); 
sheet1.addMergedRegion( region ); 
// Set the border and border colors. 
final short borderMediumDashed = HSSFCellStyle.BORDER_MEDIUM_DASHED; 
HSSFRegionUtil.setBorderBottom( borderMediumDashed, 
region, sheet1, wb ); 
HSSFRegionUtil.setBorderTop( borderMediumDashed, 
region, sheet1, wb ); 
HSSFRegionUtil.setBorderLeft( borderMediumDashed, 
region, sheet1, wb ); 
HSSFRegionUtil.setBorderRight( borderMediumDashed, 
region, sheet1, wb ); 
HSSFRegionUtil.setBottomBorderColor(HSSFColor.AQUA.index, region, sheet1, wb); 
HSSFRegionUtil.setTopBorderColor(HSSFColor.AQUA.index, region, sheet1, wb); 
HSSFRegionUtil.setLeftBorderColor(HSSFColor.AQUA.index, region, sheet1, wb); 
HSSFRegionUtil.setRightBorderColor(HSSFColor.AQUA.index, region, sheet1, wb); 
// Shows some usages of HSSFCellUtil 
HSSFCellStyle style = wb.createCellStyle(); 
style.setIndention((short)4); 
HSSFCellUtil.createCell(row, 8, "This is the value of the cell", style); 
HSSFCell cell2 = HSSFCellUtil.createCell( row2, 8, "This is the value of the cell"); 
HSSFCellUtil.setAlignment(cell2, wb, HSSFCellStyle.ALIGN_CENTER); 
// Write out the workbook 
FileOutputStream fileOut = new FileOutputStream( "workbook.xls" ); 
wb.write( fileOut ); 
fileOut.close(); 


19.在工作單中移動行,調整行的上下位置 
Java程式碼 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("row sheet");    
// Create various cells and rows for spreadsheet.    
// Shift rows 6 - 11 on the spreadsheet to the top (rows 0 - 5)    
sheet.shiftRows(5, 10, -5);    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   

HSSFWorkbook wb = new HSSFWorkbook(); 
HSSFSheet sheet = wb.createSheet("row sheet"); 
// Create various cells and rows for spreadsheet. 
// Shift rows 6 - 11 on the spreadsheet to the top (rows 0 - 5) 
sheet.shiftRows(5, 10, -5); 
FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 
wb.write(fileOut); 
fileOut.close(); 

20.選種指定的工作單 
Java程式碼 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("row sheet");    
sheet.setSelected(true);    
// Create various cells and rows for spreadsheet.    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   

HSSFWorkbook wb = new HSSFWorkbook(); 
HSSFSheet sheet = wb.createSheet("row sheet"); 
sheet.setSelected(true); 
// Create various cells and rows for spreadsheet. 
FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 
wb.write(fileOut); 
fileOut.close(); 

21.工作單的放大縮小 
Java程式碼 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet1 = wb.createSheet("new sheet");    
sheet1.setZoom(3,4); // 75 percent magnification    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   

HSSFWorkbook wb = new HSSFWorkbook(); 
HSSFSheet sheet1 = wb.createSheet("new sheet"); 
sheet1.setZoom(3,4); // 75 percent magnification 
FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 
wb.write(fileOut); 
fileOut.close(); 

22.頭注和腳註 
Java程式碼 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("new sheet");    
HSSFHeader header = sheet.getHeader();    
header.setCenter("Center Header");    
header.setLeft("Left Header");    
header.setRight(HSSFHeader.font("Stencil-Normal", "Italic") +    
HSSFHeader.fontSize((short) 16) + "Right w/ Stencil-Normal Italic font and size 16");    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   

HSSFWorkbook wb = new HSSFWorkbook(); 
HSSFSheet sheet = wb.createSheet("new sheet"); 
HSSFHeader header = sheet.getHeader(); 
header.setCenter("Center Header"); 
header.setLeft("Left Header"); 
header.setRight(HSSFHeader.font("Stencil-Normal", "Italic") + 
HSSFHeader.fontSize((short) 16) + "Right w/ Stencil-Normal Italic font and size 16"); 
FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 
wb.write(fileOut); 
fileOut.close(); 


23.圖片的使用 
Java程式碼 
//先把讀進來的圖片放到一個ByteArrayOutputStream中,以便產生ByteArray    
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();    
BufferedImage bufferImg = ImageIO.read(new File("ok.jpg"));    
ImageIO.write(bufferImg,"jpg",byteArrayOut);    
  
//讀進一個excel模版    
FileInputStream fos = new FileInputStream(filePathName+"/stencil.xlt");    
fs = new POIFSFileSystem(fos);    
//建立一個工作薄    
HSSFWorkbook wb = new HSSFWorkbook(fs);    
HSSFSheet sheet = wb.getSheetAt(0);    
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();    
HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,(short) 0,0,(short)10,10);    
patriarch.createPicture(anchor , wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));   

//先把讀進來的圖片放到一個ByteArrayOutputStream中,以便產生ByteArray 
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); 
BufferedImage bufferImg = ImageIO.read(new File("ok.jpg")); 
ImageIO.write(bufferImg,"jpg",byteArrayOut); 

//讀進一個excel模版 
FileInputStream fos = new FileInputStream(filePathName+"/stencil.xlt"); 
fs = new POIFSFileSystem(fos); 
//建立一個工作薄 
HSSFWorkbook wb = new HSSFWorkbook(fs); 
HSSFSheet sheet = wb.getSheetAt(0); 
HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); 
HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,(short) 0,0,(short)10,10); 
patriarch.createPicture(anchor , wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG)); 

//-------------------------------以上例項程式碼均來自官方網站 
//-------------------------------POI中使用的顏色是用顏色索引來實現,如下: 
/* 
* 顏色對照表 數字代表顏色索引 
8: BLACK 
60: BROWN 
59: OLIVE_GREEN 
58: DARK_GREEN 
56: DARK_TEAL 
18: DARK_BLUE 
32: DARK_BLUE 
62: INDIGO 
63: GREY_80_PERCENT 
53: ORANGE 
19: DARK_YELLOW 
17: GREEN 
21: TEAL 
38: TEAL 
12: BLUE 
39: BLUE 
54: BLUE_GREY 
23: GREY_50_PERCENT 
10: RED 
52: LIGHT_ORANGE 
50: LIME 
57: SEA_GREEN 
49: AQUA 
48: LIGHT_BLUE 
20: VIOLET 
36: VIOLET 
55: GREY_40_PERCENT 
14: PINK 
33: PINK 
51: GOLD 
13: YELLOW 
34: YELLOW 
11: BRIGHT_GREEN 
35: BRIGHT_GREEN 
15: TURQUOISE 
35: TURQUOISE 
16: DARK_RED 
37: DARK_RED 
40: SKY_BLUE 
61: PLUM 
25: PLUM 
22: GREY_25_PERCENT 
45: ROSE 
43: LIGHT_YELLOW 
42: LIGHT_GREEN 
41: LIGHT_TURQUOISE 
27:LIGHT_TURQUOISE 
44: PALE_BLUE 
46: LAVENDER 
9: WHITE 
24: CORNFLOWER_BLUE 
26: LEMON_CHIFFON 
25: MAROON 
28: ORCHID 
29: CORAL 
30: ROYAL_BLUE 
31: LIGHT_CORNFLOWER_BLUE 
*/ 
//----------------------------------------------------你可以按上面的方法來自定義顏色 
/* 
* 自定義顏色,去掉註釋,貼加,其他則檢視顏色對照表 
HSSFPalette palette = this.getCustomPalette(); 
palette.setColorAtIndex(idx, 
i, //RGB red (0-255) 
j, //RGB green 
k //RGB blue 
); 
*/ 
//------------------------------------------------- 


 

五、應用例項:

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<%@ page import="java.lang.*,computer.*"%>
<html>
<head>
<title>計算機裝置管理</title>
<%
GetData gd=new GetData();
%>
</head>
<form name="form1"  action="SaveData.jsp">
<table border="0" cellspacing="1" cellpadding="2" width="97%" align="center" bgcolor="#F6F6F6">    
 <tr><td colspan="5"><div align="center"><img src="http://aman.cao.blog.163.com/blog/images/text01.jpg" align="center"></div></td></tr>
    <tr><td colspan="5">
  <hr>
  </td></tr>
  <tr>
 <td width="15%"><div align="right">裝置編號</div></td>
   </tr>
     <tr>
    <td colspan="5"><div align="center">
          <input name="btnDo" type="submit" value="資料提交">&nbsp;&nbsp;&nbsp;&nbsp;
          <input name="btnReset" type="reset" value="重新輸入">&nbsp;&nbsp;&nbsp;&nbsp;
    <input name="btnOutToExcel" type="button" value="匯出到Excel" onClick="clickForOutToExcel();">
    </div></td></tr>
  <tr><td colspan="5">
  <hr>
  </td></tr>
   </table>
<input name="Page_Mark" type="hidden" value="Maintain">
</form>
<form name="form2" action="JSPExcel.jsp">  
 <input name="GetOrPut" type="hidden" value="">
</form>
<script language=javascript>
 function clickForOutToExcel()
 {
  document.form2.GetOrPut.value="PutMaintain";
 alert("維修裝置清單成功匯出為EXCEL檔案!\r\r請檢視C盤根目錄下的:維修清單.xls");
 document.form2.submit();
 }
</script>
</html>

六、處理有EXCEL匯入匯出要求的JSP檔案(JSPExcel.jsp)

<%@ page contentType="text/html;charset=gbk"%>
<%@ page import="java.lang.*,computer.*"%>

<html>
<head>
</head>
<body>
<% 
String gp=request.getParameter("GetOrPut"); 
String gf=Pool.toChinese(request.getParameter("GFF"));
GetOrWriteExcel gwe=new GetOrWriteExcel();
if (gp.compareTo("Put")==0) {
  try{
  gwe.AllEquipToExcel();  
  %>
  <jsp:forward page="Equip.jsp">
  <jsp:param name="" value=""/>
  </jsp:forward>
  <%

 }catch(Exception ep){
   System.out.println(ep);
 } 
}
else if (gp.compareTo("Get")==0) {
  try{
  gwe.GetEquipFromExcel(gf);
  %>
  <jsp:forward page="Equip.jsp">
  <jsp:param name="" value=""/>
  </jsp:forward>
  <%
  
 }catch(Exception ep){
   System.out.println(ep);
 } 
}
else if (gp.compareTo("PutDis")==0) {
  try{
  gwe.DisToExcel();
  %>
  <jsp:forward page="Distribute.jsp">
  <jsp:param name="" value=""/>
  </jsp:forward>
  <%  
  
 }catch(Exception ep){
   System.out.println(ep);
 } 
}
else if (gp.compareTo("PutMaintain")==0) {
  try{
  gwe.MaintainToExcel();
  %>
  <jsp:forward page="Maintain.jsp">
  <jsp:param name="" value=""/>
  </jsp:forward>
  <%  
  
 }catch(Exception ep){
   System.out.println(ep);
 } 
}
else if (gp.compareTo("PutTrash")==0) {
  try{
  gwe.TrashToExcel();
  %>
  <jsp:forward page="Trash.jsp">
  <jsp:param name="" value=""/>
  </jsp:forward>
  <%  
  
 }catch(Exception ep){
   System.out.println(ep);
 } 
}
else {
  System.out.println("GETORPUT的值是空的!");
}
%>

</body>
</html>


七、Javabean中專門處理EXCEL的匯入匯出的類:GetOrWriteExcel.java

package computer;

import java.io.*;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

public class GetOrWriteExcel {
 Pool pl;
 Connection cn;
 
 public GetOrWriteExcel(){
  try{
   pl=new Pool();
   //在辦公室通過WEB運算元據庫
   cn=pl.getConnection();
   //在辦公室用Test測試資料庫操作
   //cn=pl.getConnectForTest();
   //在家測試資料庫
   //cn=pl.getConnectAtHome();
   
   if (cn==null){
    System.out.println("資料庫連線為空");
   }
   
  } catch(Exception ex){
   System.out.println(ex);
  }  
 }

 public void AllEquipToExcel(){
  
  String sqlStr="select * from Equip_View";
  String fname="c:\\裝置清單.xls";
  
  try {
   DataToExcel(sqlStr,fname);
   System.out.println("所有裝置匯入到Excel成功!");
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } 
  
 }
 
 /*
  * 從Excel中匯入裝置列表,引數gf表示要匯入的excel檔名
  */
 public void GetEquipFromExcel(String gf)throws IOException{
  try{
   POIFSFileSystem fs=new POIFSFileSystem(new FileInputStream(gf));
   HSSFWorkbook wb=new HSSFWorkbook(fs);
   HSSFSheet sheet=wb.getSheetAt(0);
   HSSFRow row;   
   int count=0;
   count=sheet.getPhysicalNumberOfRows();
   
   //資料庫操作
   try{
   cn.setAutoCommit(false);
   Statement st=cn.createStatement();
   String sqlStr="";
   for (int i=1;i<count;i++){
    row=sheet.getRow(i);
    sqlStr="INSERT INTO Equip(EquipID,Price,BuyDate,ETypeID,DealerID,CPU,HD,MEMORY,DISPLAY,MAINBOARD,EState,Other,Remark,Spec) VALUES(";
    sqlStr += "'";
    sqlStr += row.getCell((short)0).toString().trim();
    sqlStr += "','";
    sqlStr += Float.parseFloat(row.getCell((short)1).toString());
    sqlStr += "','";
    sqlStr += row.getCell((short)2).toString().substring(0, 10);
    sqlStr += "','";
    sqlStr += row.getCell((short)3).toString().trim();
    sqlStr += "','";
    sqlStr += row.getCell((short)4).toString().trim();
    sqlStr += "','";
    sqlStr += row.getCell((short)5).toString().trim();
    sqlStr += "','";
    sqlStr += row.getCell((short)6).toString().trim();
    sqlStr += "','";
    sqlStr += row.getCell((short)7).toString().trim();
    sqlStr += "','";
    sqlStr += row.getCell((short)8).toString().trim();
    sqlStr += "','";
    sqlStr += row.getCell((short)9).toString().trim();
    sqlStr += "','";
    sqlStr += row.getCell((short)10).toString().trim();
    sqlStr += "','";
    sqlStr += row.getCell((short)11).toString().trim();
    sqlStr += "','";
    sqlStr += row.getCell((short)12).toString().trim();
    sqlStr += "','";
    sqlStr += row.getCell((short)13).toString().trim();
    sqlStr += "')";
    //System.out.println(sqlStr);
    st.addBatch(sqlStr);
    //st.execute(sqlStr);
    //System.out.println(sqlStr);
   }  
   
   st.executeBatch();
   cn.commit();
   cn.setAutoCommit(true);     
   st.close();
   System.out.println("從Excel中成功批量匯入裝置!");
   }catch(Exception se){
    System.out.println("向Equip表中批量存入資料時出錯,錯誤程式碼:" + se);
   }    
   
  }catch (FileNotFoundException e) {
   e.printStackTrace();
  }
  
 }
 
 public void DisToExcel(){
  String sqlStr="select * from Distribute_View";
  String fname="c:\\領用清單.xls";
  
  try {
   DataToExcel(sqlStr,fname);
   System.out.println("所有領用裝置匯入到Excel成功!");
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } 
 }
 
 public void MaintainToExcel(){
  String sqlStr="select * from EquipMaintain_View";
  String fname="c:\\維修清單.xls";
  
  try {
   DataToExcel(sqlStr,fname);
   System.out.println("所有維修記錄匯入到Excel成功!");
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }   
 }
 
 public void TrashToExcel(){
  String sqlStr="select * from Trash_View";
  String fname="c:\\報廢清單.xls";
  
  try {
   DataToExcel(sqlStr,fname);
   System.out.println("所有維修記錄匯入到Excel成功!");
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }  
 }
 
 /*
  * 從資料庫將資料匯出到EXCEL檔案的通用函式,引數sqlStr是傳來的sql語句,filename是要儲存的檔名與路徑
  */
 public void DataToExcel(String sqlStr,String filename) throws IOException{
  ResultSet rs = null;
  ResultSetMetaData rsmeta=null;
  Statement st = null;   
  try{ 
   String[] title;
   
   HSSFWorkbook wb=new HSSFWorkbook();
   HSSFSheet sheet=wb.createSheet("資料清單");
   HSSFRow row=sheet.createRow((short)0);//第一行顯示欄位名稱
   
   st=cn.createStatement();
   rs = st.executeQuery(sqlStr);
   rsmeta=rs.getMetaData();
   int numofCols=rsmeta.getColumnCount();
   title=new String[numofCols];
   for (int i=0;i<numofCols;i++){
    title[i]=rsmeta.getColumnName(i+1);
    row.createCell((short)i).setCellValue(title[i]);
   }
   //以下顯示資料
   int k=1;
   while(rs.next()){
    row=sheet.createRow((short)k);
    for (int j=1;j<=numofCols;j++){
     row.createCell((short)(j-1)).setCellValue(rs.getString(j));
    }
    k++;
   }
   
   FileOutputStream fileOut=new FileOutputStream(filename);
   wb.write(fileOut);
   fileOut.close();
   
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } finally {
   try {
    rs.close();
    st.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }

 }
}

相關文章