java导出exel_Java使用POI导出excel(上)——基本操作
一、概述
1.概念
受上文博文博主的启发,有必要先对excel的各个概念先做了解!

//上述基本都是接口


//一个excel表格
HSSFWorkbook wb = newHSSFWorkbook();//一个工作表格(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简介
(韩国的JExcel这里暂不介绍)
是什么?(引用官网介绍)

能干什么?
这里我们介绍导出excel的功能操作
怎么干?
我们这里先介绍HSSF的使用。
这里最主要的熟悉里面那一套接口
需要环境:这里使用POI3.9的版本(这个版本更新比较快)


org.apache.poi
poi
3.9
View Code
推荐版本单独管理的maven依赖写法:
3.9
二、基本使用(HelloWorld)
1.创建工作簿
public static void main(String[] args) throwsIOException {//创建工作簿 (使用了多态特性) HSSFWorkbook wb = new HSSFWorkbook();
Workbook wb = newHSSFWorkbook();//使用工作簿的write()方法向文件输出工作簿
FileOutputStream out = new FileOutputStream("E:\\1.xls");
wb.write(out);//流的关闭
out.close();
}

2.创建sheet页
public static void main(String[] args) throwsIOException {//创建工作簿 (使用了多态特性) HSSFWorkbook wb = new HSSFWorkbook();
Workbook wb = newHSSFWorkbook();//创建两个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) throwsIOException {//创建工作簿 (使用了多态特性) HSSFWorkbook wb = new HSSFWorkbook();
Workbook wb = newHSSFWorkbook();//创建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) throwsIOException {//创建工作簿 (使用了多态特性) HSSFWorkbook wb = new HSSFWorkbook();
Workbook wb = newHSSFWorkbook();//创建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) throwsIOException {//创建工作簿 (使用了多态特性) HSSFWorkbook wb = new HSSFWorkbook();
Workbook wb = newHSSFWorkbook();//创建sheet页(使用的是带参构造器)
Sheet sheet = wb.createSheet("sheet01");//创建行(从0开始)
Row row = sheet.createRow(0);//创建单元格(第一列)
Cell cell = row.createCell(0);//给单元格赋值
cell.setCellValue(newDate());//创建流并将wb输出
FileOutputStream out = new FileOutputStream("E:\\1.xls");
wb.write(out);//流的关闭
out.close();
}
效果:

//可以看到,是一个长整形
调整为时间样式:
public static void main(String[] args) throwsIOException {//创建工作簿 (使用了多态特性) HSSFWorkbook wb = new HSSFWorkbook();
Workbook wb = newHSSFWorkbook();//创建sheet页(使用的是带参构造器)
Sheet sheet = wb.createSheet("sheet01");//创建行(从0开始)
Row row = sheet.createRow(0);//创建单元格(第一列)
Cell cell = row.createCell(0);//给单元格赋值
cell.setCellValue(newDate());/** ==========时间样式单元格==============*/
//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(newDate());
cell2.setCellStyle(cellStyle);//创建流并将wb输出
FileOutputStream out = new FileOutputStream("E:\\2.xls");
wb.write(out);//流的关闭
out.close();
}

2.处理不同类型内容:
public static void main(String[] args) throwsIOException {
Workbook wb= newHSSFWorkbook();
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= newFileOutputStream("c:\\POI使用FileOutputStream输出流生成的工作簿.xls");
wb.write(fos);
fos.close();//wb 是需要关闭的,否则编译器会有提示
wb.close();
}
//突如其来的断点防不胜防,这里这个示例是借的网友的
3.遍历内容
public static void main(String[] args) throwsIOException {//通过输入流获取工作簿
InputStream in = new FileInputStream("E:\\1.xls");//(以下直接使用的是类而不是接口,因为类有实现还有自己的方法,更加强大)
POIFSFileSystem fs = newPOIFSFileSystem(in);
HSSFWorkbook wb= newHSSFWorkbook(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 staticString getCellValue(HSSFCell hssfCell){if(hssfCell.getCellType() ==HSSFCell.CELL_TYPE_BOOLEAN){returnString.valueOf(hssfCell.getBooleanCellValue());
}else if(hssfCell.getCellType() ==HSSFCell.CELL_TYPE_NUMERIC){returnString.valueOf(hssfCell.getNumericCellValue());
}else{returnString.valueOf(hssfCell.getStringCellValue());
}
}
网友的switch版本:


private staticString getCellDate(Cell cell) {
String return_string= null;switch(cell.getCellType()) {caseHSSFCell.CELL_TYPE_STRING:
return_string=cell.getStringCellValue();break;caseHSSFCell.CELL_TYPE_NUMERIC:
return_string= cell.getNumericCellValue() + "";break;caseHSSFCell.CELL_TYPE_BOOLEAN:
return_string=String.valueOf(cell.getBooleanCellValue());default:
return_string= "";break;
}returnreturn_string;
}
View Code


//时间样式遍历待更新
4.文本提取
public static void main(String[] args) throwsIOException {//通过输入流获取工作簿
InputStream in = new FileInputStream("E:\\1.xls");//(以下直接使用的是类而不是接口,因为类有实现还有自己的方法,更加强大)
POIFSFileSystem fs = newPOIFSFileSystem(in);
HSSFWorkbook wb= newHSSFWorkbook(fs);
ExcelExtractor excelExtractor= newExcelExtractor(wb);//抽取文本输出
System.out.println(excelExtractor.getText());
in.close();
}
//这里使用的是实现类,导包如下:
importorg.apache.poi.hssf.extractor.ExcelExtractor;importorg.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.poifs.filesystem.POIFSFileSystem;

//可以去掉sheet页名字
ExcelExtractor excelExtractor = newExcelExtractor(wb);
excelExtractor.setIncludeSheetNames(false);//抽取文本输出
System.out.println(excelExtractor.getText());
四、单元格设置对齐、边框、合并等样式
1.单元格对齐方式
public static void main(String[] args) throwsIOException {
Workbook wb= newHSSFWorkbook();
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,shortvalign){
Cell cell= row.createCell(column); //创建单元格
cell.setCellValue(new HSSFRichTextString("富文本区域")); //字符串可以使用此方式//创建并设置样式
CellStyle cellStyle =wb.createCellStyle();
cellStyle.setAlignment(hailgn);//水平方向
cellStyle.setVerticalAlignment(valign); //垂直方向//设置单元格样式
cell.setCellStyle(cellStyle);returncell;
}
效果:

其他样式请自行探索或根据文首文档查看。
2.边框处理
public static void main(String[] args) throwsIOException {
Workbook wb= newHSSFWorkbook();
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) throwsIOException {//创建工作簿和sheet页
Workbook wb = newHSSFWorkbook();
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) throwsIOException {//创建工作簿和sheet页
Workbook wb = newHSSFWorkbook();
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) throwsIOException {//创建工作簿和sheet页
Workbook wb = newHSSFWorkbook();
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) throwsIOException {
InputStream in= new FileInputStream("E:\\1.xls");//通过输入流,得到工作簿
POIFSFileSystem fs = newPOIFSFileSystem(in);
Workbook wb= newHSSFWorkbook(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) throwsIOException {//创建sheet页
Workbook wb = newHSSFWorkbook();
Sheet sheet1= wb.createSheet("sheet1");//创建单元格
Row row = sheet1.createRow(1);
Cell cell= row.createCell(1);
cell.setCellValue("即将换行 \n 换行成功");//通过样式设置允许换行
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) throwsIOException {//创建sheet页
Workbook wb = newHSSFWorkbook();
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位按逗号分隔
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)