Java使用POI导出excel(上)——基本操作
相關的介紹參考自:http://zc985552943.iteye.com/blog/1491546
一、概述
1.概念
受上文博文博主的啟發,有必要先對excel的各個概念先做了解!
//上述基本都是接口
//一個excel表格
HSSFWorkbook wb = new HSSFWorkbook();
//一個工作表格(sheet)
HSSFSheet sheet = wb.createSheet("sheet1");
//一行(row)
HSSFRow row = sheet.createRow(0);
//一個單元格(cell)
HSSFCell cell = row.createCell(0);
//單元格樣式(cellStyle)
HSSFCellStyle cellStyle = wb.createCellStyle();
//單元格內容樣式(dataFormat)
HSSFDataFormat format = wb.createDataFormat();
View Code
2.POI簡介
官網:http://poi.apache.org/
官方API:http://poi.apache.org/apidocs/index.html
(韓國的JExcel這里暫不介紹)
是什么?(引用官網介紹)
能干什么?
這里我們介紹導出excel的功能操作
怎么干?
我們這里先介紹HSSF的使用。
這里最主要的熟悉里面那一套接口
需要環境:這里使用POI3.9的版本(這個版本更新比較快)
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
View Code
推薦版本單獨管理的maven依賴寫法:
<poi.version>3.9</poi.version>
二、基本使用(HelloWorld)
1.創建工作簿
public static void main(String[] args) throws IOException {
//創建工作簿 (使用了多態特性) HSSFWorkbook wb = new HSSFWorkbook();
Workbook wb = new HSSFWorkbook();
//使用工作簿的write()方法向文件輸出工作簿
FileOutputStream out = new FileOutputStream("E:\1.xls");
wb.write(out);
//流的關閉
out.close();
}
2.創建sheet頁
public static void main(String[] args) throws IOException {
//創建工作簿 (使用了多態特性) HSSFWorkbook wb = new HSSFWorkbook();
Workbook wb = new HSSFWorkbook();
//創建兩個sheet頁
wb.createSheet("sheet1");
wb.createSheet("sheet2");
//創建流并將wb輸出
FileOutputStream out = new FileOutputStream("E:\2.xls");
wb.write(out);
//流的關閉
out.close();
}
3.創建行和單元格
excel中行的概念:(單元格即為行的每一個元素)
public static void main(String[] args) throws IOException {
//創建工作簿 (使用了多態特性) HSSFWorkbook wb = new HSSFWorkbook();
Workbook wb = new HSSFWorkbook();
//創建sheet頁(使用的是帶參構造器)
Sheet sheet = wb.createSheet("sheet01");
//創建行(從0開始)
Row row = sheet.createRow(0);
//創建單元格(第一列)
Cell cell = row.createCell(0);
//給單元格賦值
cell.setCellValue("測試單元格內容");
//創建流并將wb輸出
FileOutputStream out = new FileOutputStream("E:\3.xls");
wb.write(out);
//流的關閉
out.close();
}
單元格創建其他值的示例
public static void main(String[] args) throws IOException {
//創建工作簿 (使用了多態特性) HSSFWorkbook wb = new HSSFWorkbook();
Workbook wb = new HSSFWorkbook();
//創建sheet頁(使用的是帶參構造器)
Sheet sheet = wb.createSheet("sheet01");
//創建行(從0開始)
Row row = sheet.createRow(0);
//創建單元格(第一列)
Cell cell = row.createCell(0);
//給單元格賦值
cell.setCellValue("測試單元格內容");
//測試其他的賦值方式
row.createCell(1).setCellValue(1.1); //第二列賦浮點值
row.createCell(2).setCellValue(false); //第三列賦值boolean型
//創建流并將wb輸出
FileOutputStream out = new FileOutputStream("E:\4.xls");
wb.write(out);
//流的關閉
out.close();
}
三、單元格數據格式
1.時間樣式單元格
public static void main(String[] args) throws IOException {
//創建工作簿 (使用了多態特性) HSSFWorkbook wb = new HSSFWorkbook();
Workbook wb = new HSSFWorkbook();
//創建sheet頁(使用的是帶參構造器)
Sheet sheet = wb.createSheet("sheet01");
//創建行(從0開始)
Row row = sheet.createRow(0);
//創建單元格(第一列)
Cell cell = row.createCell(0);
//給單元格賦值
cell.setCellValue(new Date());
//創建流并將wb輸出
FileOutputStream out = new FileOutputStream("E:\1.xls");
wb.write(out);
//流的關閉
out.close();
}
效果:
//可以看到,是一個長整形
調整為時間樣式:
public static void main(String[] args) throws IOException {
//創建工作簿 (使用了多態特性) HSSFWorkbook wb = new HSSFWorkbook();
Workbook wb = new HSSFWorkbook();
//創建sheet頁(使用的是帶參構造器)
Sheet sheet = wb.createSheet("sheet01");
//創建行(從0開始)
Row row = sheet.createRow(0);
//創建單元格(第一列)
Cell cell = row.createCell(0);
//給單元格賦值
cell.setCellValue(new Date());
/*
* ==========時間樣式單元格==============
*/
// CreationHelper 可以理解為一個工具類,由這個工具類可以獲得 日期格式化的一個實例
CreationHelper creationHelper = wb.getCreationHelper();
//創建單元格樣式類
CellStyle cellStyle = wb.createCellStyle();
//設置時間樣式
cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));
//給第一行第二列賦值
Cell cell2 = row.createCell(1);
cell2.setCellValue(new Date());
cell2.setCellStyle(cellStyle);
//創建流并將wb輸出
FileOutputStream out = new FileOutputStream("E:\2.xls");
wb.write(out);
//流的關閉
out.close();
}
2.處理不同類型內容:
public static void main(String[] args) throws IOException {
Workbook wb = new HSSFWorkbook();
Sheet sheet1 = wb.createSheet("三年級(1)班學生名單");
Row row = sheet1.createRow(0);
row.createCell(0).setCellValue(1);
row.createCell(1).setCellValue("一個字符串");
row.createCell(2).setCellValue(true);
row.createCell(3).setCellValue(HSSFCell.CELL_TYPE_NUMERIC);
row.createCell(4).setCellValue(false);
FileOutputStream fos = new FileOutputStream(
"c:\POI使用FileOutputStream輸出流生成的工作簿.xls");
wb.write(fos);
fos.close();
// wb 是需要關閉的,否則編譯器會有提示
wb.close();
}
//突如其來的斷點防不勝防,這里這個示例是借的網友的
3.遍歷內容
public static void main(String[] args) throws IOException {
//通過輸入流獲取工作簿
InputStream in = new FileInputStream("E:\1.xls");
//(以下直接使用的是類而不是接口,因為類有實現還有自己的方法,更加強大)
POIFSFileSystem fs = new POIFSFileSystem(in);
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet hssfSheet = wb.getSheetAt(0); //獲取第一個sheet頁
if(hssfSheet == null){ //sheet頁不存在,不做處理
return;
}
//遍歷行
for(int rowNum = 0; rowNum <= hssfSheet.getLastRowNum(); rowNum++){
HSSFRow hssfRow = hssfSheet.getRow(rowNum);
if(hssfRow == null){ //空處理
continue;
}
//遍歷列
for(int cellNum = 0; cellNum <= hssfRow.getLastCellNum(); cellNum++){
HSSFCell hssfCell = hssfRow.getCell(cellNum);
if(hssfCell == null){ //空處理
continue;
}
System.out.print(getCellValue(hssfCell)+" ");
}
System.out.println();
}
}
/**
* 封裝的類型轉換處理靜態方法
*/
private static String getCellValue(HSSFCell hssfCell){
if(hssfCell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN){
return String.valueOf(hssfCell.getBooleanCellValue());
} else if(hssfCell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){
return String.valueOf(hssfCell.getNumericCellValue());
} else{
return String.valueOf(hssfCell.getStringCellValue());
}
}
網友的switch版本:
private static String getCellDate(Cell cell) {
String return_string = null;
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_STRING:
return_string = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_NUMERIC:
return_string = cell.getNumericCellValue() + "";
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
return_string = String.valueOf(cell.getBooleanCellValue());
default:
return_string = "";
break;
}
return return_string;
}
View Code
//時間樣式遍歷待更新
4.文本提取
public static void main(String[] args) throws IOException {
//通過輸入流獲取工作簿
InputStream in = new FileInputStream("E:\1.xls");
//(以下直接使用的是類而不是接口,因為類有實現還有自己的方法,更加強大)
POIFSFileSystem fs = new POIFSFileSystem(in);
HSSFWorkbook wb = new HSSFWorkbook(fs);
ExcelExtractor excelExtractor = new ExcelExtractor(wb);
//抽取文本輸出
System.out.println(excelExtractor.getText());
in.close();
}
//這里使用的是實現類,導包如下:
import org.apache.poi.hssf.extractor.ExcelExtractor; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.POIFSFileSystem;
//可以去掉sheet頁名字
ExcelExtractor excelExtractor = new ExcelExtractor(wb);
excelExtractor.setIncludeSheetNames(false);
//抽取文本輸出
System.out.println(excelExtractor.getText());
四、單元格設置對齊、邊框、合并等樣式
1.單元格對齊方式
public static void main(String[] args) throws IOException {
Workbook wb = new HSSFWorkbook();
Sheet sheet1 = wb.createSheet("sheet1");
Row row = sheet1.createRow(2); //創建第3行
row.setHeightInPoints(30); //設置行高(可參見API等 )
//調用封裝的方法,創建單元格 (樣式均是常量)
Cell cell1 = createCell(wb, row, (short)0, HSSFCellStyle.ALIGN_CENTER, HSSFCellStyle.VERTICAL_BOTTOM); //使用short足夠
cell1.setCellValue("操作Excel");
Cell cell2= createCell(wb, row, (short)1, HSSFCellStyle.ALIGN_CENTER, HSSFCellStyle.VERTICAL_TOP); //使用short足夠
cell2.setCellValue("操作Excel");
FileOutputStream fos = new FileOutputStream("E:\5.xls");
wb.write(fos);
fos.close();
}
封裝的私有方法:(請重視封裝)
private static Cell createCell(Workbook wb,Row row,short column,short hailgn,short valign){
Cell cell = row.createCell(column); //創建單元格
cell.setCellValue(new HSSFRichTextString("富文本區域")); //字符串可以使用此方式
//創建并設置樣式
CellStyle cellStyle = wb.createCellStyle();
cellStyle.setAlignment(hailgn); //水平方向
cellStyle.setVerticalAlignment(valign); //垂直方向
//設置單元格樣式
cell.setCellStyle(cellStyle);
return cell;
}
效果:
其他樣式請自行探索或根據文首文檔查看。
2.邊框處理
public static void main(String[] args) throws IOException {
Workbook wb = new HSSFWorkbook();
Sheet sheet1 = wb.createSheet("sheet1");
Row row = sheet1.createRow(1); //創建第2行
Cell cell = row.createCell(1); //創建第二列
cell.setCellValue("666");
//單元格樣式
CellStyle cellStyle = wb.createCellStyle();
//同樣,通過常量進行設置
cellStyle.setBorderBottom(CellStyle.BORDER_THIN); //底部邊框樣式
//通過顏色索引設置底部顏色
cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); //底部邊框顏色
//同理,設置左邊樣式
cellStyle.setBorderLeft(CellStyle.BORDER_THICK); //左邊邊框樣式
cellStyle.setLeftBorderColor(IndexedColors.BLUE.getIndex()); //左邊邊框顏色
//同理,設置右邊樣式
cellStyle.setBorderRight(CellStyle.BORDER_DASHED);
cellStyle.setRightBorderColor(IndexedColors.GREEN.getIndex());
//最后,設置頂部樣式
cellStyle.setBorderTop(CellStyle.BORDER_THIN);
cellStyle.setTopBorderColor(IndexedColors.BROWN.getIndex());
//注入樣式
cell.setCellStyle(cellStyle);
FileOutputStream fos = new FileOutputStream("E:\6.xls");
wb.write(fos);
fos.close();
}
效果:
3.單元格填充色和顏色操作
public static void main(String[] args) throws IOException {
//創建工作簿和sheet頁
Workbook wb = new HSSFWorkbook();
Sheet sheet1 = wb.createSheet("sheet1");
Row row = sheet1.createRow(1); //創建第2行
Cell cell = row.createCell(1); //創建第2列
cell.setCellValue("777");
CellStyle cellStyle = wb.createCellStyle();
cellStyle.setFillBackgroundColor(IndexedColors.GREEN.getIndex()); //背景色
cellStyle.setFillPattern(CellStyle.BIG_SPOTS); //帶點的效果
//注入樣式
cell.setCellStyle(cellStyle);
Cell cell2 = row.createCell(2); //創建第2列
cell2.setCellValue("777");
CellStyle cellStyle2 = wb.createCellStyle();
cellStyle2.setFillForegroundColor(IndexedColors.BLUE.getIndex()); //前景色
cellStyle2.setFillPattern(CellStyle.SOLID_FOREGROUND);
//注入樣式
cell2.setCellStyle(cellStyle2);
FileOutputStream fos = new FileOutputStream("E:\7.xls");
wb.write(fos);
fos.close();
}
單元格顏色樣式背景色未正確顯示,待更新:
4.單元格合并
public static void main(String[] args) throws IOException {
//創建工作簿和sheet頁
Workbook wb = new HSSFWorkbook();
Sheet sheet1 = wb.createSheet("sheet1");
Row row = sheet1.createRow(1); //創建第2行
Cell cell = row.createCell(1); //創建第2列
cell.setCellValue("單元格合并測試");
//單元格合并是由sheet來控制的,cell是無法控制合并的(只能管自己的樣式)
//四個參數:起始結束行;起始結束列(注意都是從0開始)
sheet1.addMergedRegion(new CellRangeAddress(1, 1, 1, 2));
FileOutputStream fos = new FileOutputStream("E:\8.xls");
wb.write(fos);
fos.close();
}
效果:
進一步測試合并4個單元格
sheet1.addMergedRegion(new CellRangeAddress(1, 2, 1, 2));
效果:
五、操作excel的其他處理
1.字體處理
public static void main(String[] args) throws IOException {
//創建工作簿和sheet頁
Workbook wb = new HSSFWorkbook();
Sheet sheet1 = wb.createSheet("sheet1");
Row row = sheet1.createRow((short)1); //創建第2行
//創建字體處理類
Font font = wb.createFont();
//設置字體相關樣式
font.setFontHeightInPoints((short)24); //設置高度
font.setFontName("Courier New"); //設置字體名字(官方demo的寬體字體)
font.setItalic(true); //設置是否斜體
font.setStrikeout(true); //一種中間帶線的樣式(類似刪除線),見效果
//創建cellStyle,font是style中的一個樣式
CellStyle cellStyle = wb.createCellStyle();
cellStyle.setFont(font);
Cell cell = row.createCell((short)1);
cell.setCellValue("單元格字體測試");
//注入樣式
cell.setCellStyle(cellStyle);
FileOutputStream fos = new FileOutputStream("E:\1.xls");
wb.write(fos);
fos.close();
}
2.讀取和重寫工作簿
public static void main(String[] args) throws IOException {
InputStream in = new FileInputStream("E:\1.xls");
//通過輸入流,得到工作簿
POIFSFileSystem fs = new POIFSFileSystem(in);
Workbook wb = new HSSFWorkbook(fs);
//通過下標獲取sheet頁
Sheet sheet1 = wb.getSheetAt(0);
Row row = sheet1.getRow(1); //獲取第一行
Cell cell = row.getCell(0); //獲取第一個單元格
if(cell == null){ //為 Null則新建一個
cell = row.createCell(3);
}
cell.setCellType(Cell.CELL_TYPE_STRING);
cell.setCellValue("測試讀取重寫");
FileOutputStream fos = new FileOutputStream("E:\1.xls");
//重新寫回原處
wb.write(fos);
fos.close();
}
//如報錯,應該是excel文件被占用,退出文件占用即可
效果:
3.單元格使用換行
如何在excel中換行呢?——使用 alt+enter
public static void main(String[] args) throws IOException {
//創建sheet頁
Workbook wb = new HSSFWorkbook();
Sheet sheet1 = wb.createSheet("sheet1");
//創建單元格
Row row = sheet1.createRow(1);
Cell cell = row.createCell(1);
cell.setCellValue("即將換行
換行成功");
//通過樣式設置允許換行
CellStyle cellStyle = wb.createCellStyle();
cellStyle.setWrapText(true); //允許換行
cell.setCellStyle(cellStyle);
//調整行高(2倍默認行高)
row.setHeightInPoints(2*sheet1.getDefaultRowHeightInPoints());
//調整寬度,詳見API
sheet1.autoSizeColumn(2);
FileOutputStream fos = new FileOutputStream("E:\2.xls");
wb.write(fos);
fos.close();
}
效果:
4.創建用戶自定義數據格式
public static void main(String[] args) throws IOException {
//創建sheet頁
Workbook wb = new HSSFWorkbook();
Sheet sheet1 = wb.createSheet("sheet1");
//數據格式屬于style里的,類似字體
DataFormat format = wb.createDataFormat();
//定義
CellStyle cellStyle;
Row row;
Cell cell;
short rowNum = 0;
short cellNum = 0;
//創建
row = sheet1.createRow(rowNum++);
cell = row.createCell(cellNum++);
cell.setCellValue(10086.258);
cellStyle = wb.createCellStyle();
cellStyle.setDataFormat(format.getFormat("0.0")); //設置數據格式
//注入樣式
cell.setCellStyle(cellStyle);
//=========================
row = sheet1.createRow(rowNum++);
cell = row.createCell(cellNum++);
cell.setCellValue(3456789.258);
cellStyle = wb.createCellStyle();
cellStyle.setDataFormat(format.getFormat("#,##0.000")); //設置數據格式
//注入樣式
cell.setCellStyle(cellStyle);
FileOutputStream fos = new FileOutputStream("E:\3.xls");
wb.write(fos);
fos.close();
}
//定義與創建分離的寫法(推薦)
效果:
其中,0.0為保留一位小數,自動四舍五入了
第二個為3位3位按逗號分隔
總結
以上是生活随笔為你收集整理的Java使用POI导出excel(上)——基本操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你知道PORT吗?
- 下一篇: 部标809协议2019版本与2011版本