java操做excel文件,有兩種工具可使用,一種是jxl,一種是poi。最近作的需求,使用到poi,所以本文介紹poi的使用(目前只介紹寫excel文件)。html
1、簡介java
Jakarta POI 是apache的子項目,目標是處理ole2對象。它提供了一組操縱Windows文檔的Java APIapache
目前比較成熟的是HSSF接口,處理MS Excel對象。它不象咱們僅僅是用csv生成的沒有格式的能夠由Excel轉換的東西,而是真正的Excel對象,你能夠控制一些屬性如sheet,cell等等。 poi中,經過HSSF,你能夠用純Java代碼來讀取、寫入、修改Excel文件。app
HSSF 爲讀取操做提供了兩類API:usermodel和eventusermodel,即「用戶模型」和「事件-用戶模型」。前者很好理解,後者比較抽象,但操做效率要高得多。ide
2、使用HSSF API建立excel文檔函數
一、HSSF的幾個實體類:工具
HSSFWorkBook : 整個excel文件字體
HSSFSheet :工做表ui
HSSFRow : 行spa
HSSFCell : 單元格
HSSFCellStyle : 單元格樣式
HSSFFont :單元格字體
HSSFDataFormat : 單元格內容格式化
HSSFRichTextString : 單元格文本內容
還有其餘一些實體,這裏不一一列舉
二、HSSFWorkBook
WorkBook是經過new HSSFWorkBook實例來建立。
HSSFWorkbook workBook = new HSSFWorkbook();
三、HSSFSheet Sheet經過HSSFWorkBook實例的createSheet()函數來建立。 HSSFSheet sheet = workBook.createSheet(); 新建立的多個sheet自動按照順序添加到WorkBook。 Sheet建立的時候並無指定名字(底部tab顯示的名稱),能夠調用HSSFWorkbook的setSheetName函數來手工設置。如 workBook.setSheetName(sheetindex,"SheetName"); 參數sheetindex 從0開始
四、HSSFRow Row是經過HSSFSheet實例的createRow(rowNumber)函數建立的。 參數rowNumber從0開始。 HSSFRow row = sheet.createRow(0); 能夠調用setHeight(height)函數設置Row的高度; 其中height單位爲twip,即1/20個point。 高度也能夠經過setHeightInPoints函數來設置。
五、HSSFCell Cell經過HSSFRow實例的createCell(column)或createCell(column, type)函數來建立。 Cell的type HSSFCell.CELL_TYPE_NUMERIC
HSSFCell.CELL_TYPE_STRING
HSSFCell.CELL_TYPE_FORMULA
HSSFCell.CELL_TYPE_BLANK 默認值
HSSFCell.CELL_TYPE_BOOLEAN
Cell的值 調用setCellValue(para)函數來設置。Para參數是HSSFRichTextString、double、Date、Calander。 單個Cell沒有width值,必須HSSFSheet實例的setColumnWidth(colindex, width)函數來設置,單位是1/256個character。例如,若是第一列單元格寬度設置爲8個字符寬度,則使用:sheet.setColumnWidth(0, 8*256);
另外,HSSFSheet提供了autoSizeColumn(short column)方法,來根據單元格內容,自動調整列的寬度。該方法效率很低,不推薦使用(特別是數據量很大的時候)。
六、HSSFFont
HSSFFont是經過HSSFWorkbook實例的createFont()方法建立的,即:
HSSFFont font = workBook.createFont();
font.setFontHeightInPoints((short) 11); // 字體大小 font.setFontName("宋體");
七、HSSFDataFormat
HSSFDataFormat,用來設置單元格的格式,例如數字、日期格式。經過HSSFWorkbook實例的createDataFormat()方法來建立對象,即:
HSSFDataFormat dataFormat = workBook.createDataFormat();
建立以後,使用style進行設置,即:
style.setDataFormat(dataFormat.getFormat("yyyy-mm-dd hh:mm:ss"));
八、HSSFCellStyle
HSSFCellStyle實例是經過HSSFWorkbook實例的createCellStyle()方法來建立的,即:
HSSFCellStyle style = workBook.createCellStyle(); style.setFont(font); style.setAlignment(HSSFCellStyle.ALIGN_LEFT); style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); style.setWrapText(false); // 是否換行 style.setDataFormat(dataFormat.getFormat("yyyy-mm-dd hh:mm:ss")); import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Date; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFDataFormat; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFRichTextString; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; public class WriteExcel { private static final String DATE_FORMAT = "yyyy-mm-dd hh:mm:ss"; private static final String MONEY_FORMAT = "###,##0.00"; public static void main(String[] args) throws IOException { export(); } public static HSSFCellStyle createCellStyle(HSSFWorkbook workBook, HSSFFont font, short align) { HSSFCellStyle style = workBook.createCellStyle(); style.setFont(font); style.setAlignment(align); style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); return style; } public static HSSFCellStyle createWrapCellStyle(HSSFWorkbook workBook, HSSFFont font, short align, boolean wrapped) { HSSFCellStyle style = workBook.createCellStyle(); style.setFont(font); style.setAlignment(align); style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); style.setWrapText(wrapped); return style; } public static HSSFCellStyle createFormatCellStyle(HSSFWorkbook workBook, HSSFFont font, short align, HSSFDataFormat dataFormat, String format) { HSSFCellStyle style = workBook.createCellStyle(); style.setFont(font); style.setAlignment(align); style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); style.setDataFormat(dataFormat.getFormat(format)); return style; } public static void createStringCell(HSSFRow row, short column, HSSFCellStyle cellStyle, String value) { HSSFCell cell = row.createCell(column); cell.setCellStyle(cellStyle); cell.setCellValue(new HSSFRichTextString(value)); } public static void createNumberCell(HSSFRow row, short column, HSSFCellStyle cellStyle, double value) { HSSFCell cell = row.createCell(column); cell.setCellStyle(cellStyle); cell.setCellValue(value); } public static void createDateCell(HSSFRow row, short column, HSSFCellStyle cellStyle, Date value) { HSSFCell cell = row.createCell(column); cell.setCellStyle(cellStyle); cell.setCellValue(value); } public static void export() throws IOException { HSSFWorkbook workBook = new HSSFWorkbook(); HSSFSheet sheet = workBook.createSheet(); workBook.setSheetName(0, "sheet1"); // 字體 HSSFFont titleFont = workBook.createFont(); titleFont.setFontHeightInPoints((short) 11); titleFont.setFontName("宋體"); HSSFDataFormat dataFormat = workBook.createDataFormat(); // 單元格樣式 HSSFCellStyle leftStyle = createCellStyle(workBook, titleFont, HSSFCellStyle.ALIGN_LEFT); HSSFCellStyle rightStyle = createCellStyle(workBook, titleFont, HSSFCellStyle.ALIGN_RIGHT); HSSFCellStyle wrapStyle = createWrapCellStyle(workBook, titleFont, HSSFCellStyle.ALIGN_LEFT, true); HSSFCellStyle dateStyle = createFormatCellStyle(workBook, titleFont, HSSFCellStyle.ALIGN_RIGHT, dataFormat, DATE_FORMAT); HSSFCellStyle moneyStyle = createFormatCellStyle(workBook, titleFont, HSSFCellStyle.ALIGN_RIGHT, dataFormat, MONEY_FORMAT); int rowIndex = 0; // excel標題行 HSSFRow row = sheet.createRow(rowIndex); short index = (short) 0; for (int i = 0; i < 6; i ++) { createStringCell(row, index, leftStyle, "列標題" + i); sheet.setColumnWidth(index, (short) (20 * 256)); // 20個字符的寬度 index++; } // 內容 for (int i = 0; i < 10; i++) { row = sheet.createRow(++rowIndex); createStringCell(row, (short) 0, leftStyle, "26688135"); createStringCell(row, (short) 1, wrapStyle, "這是簡介"); createNumberCell(row, (short) 2, moneyStyle, 100.05); createDateCell(row, (short) 3, dateStyle, new Date()); createStringCell(row, (short) 4, wrapStyle, "第一行內容 /r/n第二行內容/r/n第三行內容"); // 使用/r/n,強制換行 createNumberCell(row, (short) 5, rightStyle, 100); } // 輸出 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("abc.xls")); workBook.write(bos); bos.close(); } }
轉載自:http://blog.csdn.net/zhutulang/article/details/6885637
常見的單元格設置還有:
1.合併單元格;
2.單元格水平居中、垂直居中;
3.定義日期格式:
1. poi的「
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);
2. 真正的日期自定義格式,應該參考「
HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet("format sheet"); HSSFDataFormat format = wb.createDataFormat(); HSSFRow row = sheet.createRow(0); HSSFCell cell = row.createCell(0); HSSFCellStyle style = wb.createCellStyle(); style.setDataFormat(format.getFormat"yyyy年MM月dd日")); cell.setCellValue(new Date()); cell.setCellStyle(style);
參考文檔: