java 导出excel教程_Java使用POI导出excel(上)——基本操作

本文详细介绍使用Java POI库操作Excel文件的方法,包括创建、读取、修改Excel文档及设置单元格样式等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

1.概念

受上文博文博主的启发,有必要先对excel的各个概念先做了解!

b4ddcd31bda5b407f3319fac22afbf99.png

//上述基本都是接口

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

//一个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简介

(韩国的JExcel这里暂不介绍)

是什么?(引用官网介绍)

68e1635fd49f9c6ed16c63c16ba7fe34.png

能干什么?

这里我们介绍导出excel的功能操作

怎么干?

我们这里先介绍HSSF的使用。

这里最主要的熟悉里面那一套接口

需要环境:这里使用POI3.9的版本(这个版本更新比较快)

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

org.apache.poi

poi

3.9

View Code

推荐版本单独管理的maven依赖写法:

3.9

二、基本使用(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();

}

815850a565a3eae471ab3861b1e31b4a.png

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();

}

30ac72f6988eb80abc96f7730504f283.png

3.创建行和单元格

excel中行的概念:(单元格即为行的每一个元素)

39101e922e7cafa4abdc0212303ad429.png

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();

}

88274a0d1ac1679df4299e91a12bb991.png

单元格创建其他值的示例

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();

}

391f26bcc0d329c2b835f4ce423c665e.png

三、单元格数据格式

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();

}

效果:

2e8df15e3fa5c27f02f4ab6f5224ce47.png

//可以看到,是一个长整形

调整为时间样式:

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();

}

2eff5aca4d2d249aec5b35fa5d0e7bdc.png

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版本:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

5bf8e0b7e8703fa96549188c0ca26c2a.png

bafa8c503bb3e0839dffc9c351bf2a20.png

//时间样式遍历待更新

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;

178fd8308983564020526c364d50c961.png

//可以去掉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;

}

效果:

ac452f4458f219ee2f39ec9ba0ce375b.png

其他样式请自行探索或根据文首文档查看。

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();

}

效果:

f2c27290895a40e0105db01c38f3a0f6.png

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();

}

单元格颜色样式背景色未正确显示,待更新:

c682b3ffc47f1d93898581282a0d8314.png

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();

}

效果:

8e7c0ead00a1e15ad6700b9a9d76de52.png

进一步测试合并4个单元格

sheet1.addMergedRegion(new CellRangeAddress(1, 2, 1, 2));

效果:

5772941e8544196395bc840465e5c1cb.png

五、操作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();

}

76341eb52c89c408fe80c3ab255e0167.png

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文件被占用,退出文件占用即可

效果:

848be20cdcde2cf1e114a1417e16c58d.png

3.单元格使用换行

如何在excel中换行呢?——使用 alt+enter

1c89864a98b47ac41df9a9c8933981be.png

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("即将换行 \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();

}

效果:

e881c7cc988927763fae7449df4f5e91.png

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();

}

//定义与创建分离的写法(推荐)

效果:

d872c600d49809ee5645181ecee35e50.png

其中,0.0为保留一位小数,自动四舍五入了

第二个为3位3位按逗号分隔

来源:https://www.cnblogs.com/jiangbei/p/7306849.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值