POI操作Excel入门案例(Spring boot)
文章目录
- 一、简介
- 二、POI结构说明
- 三、常用的方法
- 1、HSSFWorkbook :工作簿,代表一个excel的整个文档
- 2、HSSFSheet:工作表
- 3、HSSFRow :行
- 4、HSSFCell:单元格
- 5、HSSFCellStyle :单元格样式
- 6、HSSFFont:字体
- 7、其它
- 四、使用案例
- 1、导入pom依赖
- 2、Demo1:生成EXCEL表格
- 3、Demo2:导入EXCEL表格
- 4、Demo3:通过web接口传递EXCEL表格
- 五、工具类
一、简介
Apache POI是Apache软件基金会的免费开源的跨平台的 Java API,POI提供API给Java程序对Microsoft Office格式(Excel、WORD、PowerPoint、Visio等)读和写的功能。.NET的开发人员则可以利用NPOI (POI for .NET) 来存取 Microsoft Office文档的功能。
二、POI结构说明
HSSF:提供读写Microsoft Excel XLS格式档案的功能。XSSF:提供读写Microsoft Excel OOXML XLSX格式档案的功能。HWPF:提供读写Microsoft Word DOC97格式档案的功能。XWPF:提供读写Microsoft Word DOC2003格式档案的功能。HSLF:提供读写Microsoft PowerPoint格式档案的功能。HDGF:提供读Microsoft Visio格式档案的功能。HPBF:提供读Microsoft Publisher格式档案的功能。HSMF:提供读Microsoft Outlook格式档案的功能。

三、常用的方法
1、HSSFWorkbook :工作簿,代表一个excel的整个文档
HSSFWorkbook():创建一个新的工作簿HSSFWorkbook(InputStream inputStream):创建一个关联输入流的工作簿,可以将一个excel文件封装成工作簿HSSFSheet createSheet(String sheetname):创建一个新的SheetHSSFSheet getSheet(String sheetName):通过名称获取SheetHSSFSheet getSheetAt(int index):通过索引获取Sheet,索引从0开始HSSFCellStyle createCellStyle():创建单元格样式int getNumberOfSheets():获取sheet的个数setActiveSheet(int index):设置默认选中的工作表write():write(File newFile):write(OutputStream stream):
2、HSSFSheet:工作表
HSSFRow createRow(int rownum):创建新行,需要指定行号,行号从0开始HSSFRow getRow(int index):根据索引获取指定的行int addMergedRegion(CellRangeAddress region):合并单元格CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol):单元格范围, 用于合并单元格,需要指定要合并的首行、最后一行、首列、最后一列。autoSizeColumn(int column):自动调整列的宽度来适应内容getLastRowNum():获取最后的行的索引,没有行或者只有一行的时候返回0setColumnWidth(int columnIndex, int width):设置某一列的宽度,width=字符个数 * 256,例如20个字符的宽度就是20 * 256
3、HSSFRow :行
-
HSSFCell createCell(int column):创建新的单元格 -
HSSFCell setCell(shot index): -
HSSFCell getCell(shot index): -
setRowStyle(HSSFCellStyle style):设置行样式 -
short getLastCellNum():获取最后的单元格号,如果单元格有第一个开始算,lastCellNum就是列的个数 -
setHeightInPoints(float height):设置行的高度
4、HSSFCell:单元格
-
setCellValue(String value):设置单元格的值 -
setCellType():设置单元格类型,如 字符串、数字、布尔等 -
setCellStyle():设置单元格样式 -
String getStringCellValue():获取单元格中的字符串值 -
setCellStyle(HSSFCellStyle style):设置单元格样式,例如字体、加粗、格式化 -
setCellFormula(String formula):设置计算公式,计算的结果作为单元格的值,也提供了异常常用的函数,如求和"sum(A1,C1)"、日期函数、字符串相关函数、CountIf和SumIf函数、随机数函数等
5、HSSFCellStyle :单元格样式
-
setFont(Font font):为单元格设置字体样式 -
setAlignment(HorizontalAlignment align):设置水平对齐方式 -
setVerticalAlignment(VerticalAlignment align):设置垂直对齐方式 -
setFillPattern(FillPatternType fp): -
setFillForegroundColor(short bg):设置前景色 -
setFillBackgroundColor(short bg):设置背景颜色
6、HSSFFont:字体
setColor(short color):设置字体颜色setBold(boolean bold):设置是否粗体setItalic(boolean italic):设置倾斜setUnderline(byte underline):设置下划线
7、其它
HSSFName:名称
HSSFDataFormat:日期格式化
HSSFHeader:Sheet的头部
HSSFFooter:Sheet的尾部
HSSFDateUtil:日期工具
HSSFPrintSetup:打印设置
HSSFErrorConstants:错误信息表
四、使用案例
1、导入pom依赖
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.8</version></dependency>
2、Demo1:生成EXCEL表格
一个入门的小Demo,将文件放在桌面或者指定绝对路径,文件名称为testexcel.xls的文件,即可;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;import javax.swing.filechooser.FileSystemView;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Date;public class poiUtils {public void poiWrite() throws Exception {
// 1、获取输出路径
// 1.1 获取桌面路径FileSystemView fsv = FileSystemView.getFileSystemView();String desktop = fsv.getHomeDirectory().getPath();String filePath = desktop + "/testexcel.xls";
// 1.2、从绝对路径获取文件
// String filePath = "D:\\testexcel.xls";// 2、创建输出路径的I/O流File file = new File(filePath);OutputStream outputStream = new FileOutputStream(file);// 3、创建工作簿对象,并获取工作表1HSSFWorkbook workbook = new HSSFWorkbook();HSSFSheet sheet = workbook.createSheet("Sheet1");// 4、创建行对象,并设置每行的数据(==第一行==)HSSFRow row = sheet.createRow(0);row.createCell(0).setCellValue("id");row.createCell(1).setCellValue("订单号");row.createCell(2).setCellValue("下单时间");row.createCell(3).setCellValue("个数");row.createCell(4).setCellValue("单价");row.createCell(5).setCellValue("订单金额");row.setHeightInPoints(30); // 设置行的高度// 5、创建行对象,设置每列的数据(==第二行==)HSSFRow row1 = sheet.createRow(1);
// 5.1 第一.二列数据row1.createCell(0).setCellValue("1");row1.createCell(1).setCellValue("NO00001");// 5.2 第三列数据(输入日期、并设置列宽)// 日期格式化HSSFCellStyle cellStyle2 = workbook.createCellStyle();HSSFCreationHelper creationHelper = workbook.getCreationHelper();cellStyle2.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));sheet.setColumnWidth(2, 20 * 256); // 设置列的宽度
// 将数据添加到第三列中HSSFCell cell2 = row1.createCell(2);cell2.setCellStyle(cellStyle2);cell2.setCellValue(new Date());// 5.3 第四列数据row1.createCell(3).setCellValue(2);// 5.4 第五列数据(保留两位小数)HSSFCellStyle cellStyle3 = workbook.createCellStyle();cellStyle3.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));HSSFCell cell4 = row1.createCell(4);//创建列对象cell4.setCellStyle(cellStyle3);//设置样式cell4.setCellValue(29.5);//输入数据// 5.4 第六列数据(进行计算)HSSFCellStyle cellStyle4 = workbook.createCellStyle();HSSFFont font = workbook.createFont();font.setFontName("华文行楷");font.setFontHeightInPoints((short) 15);font.setColor(HSSFColor.RED.index);cellStyle4.setFont(font);
// 将数据设置到第六列中HSSFCell cell5 = row1.createCell(5);cell5.setCellFormula("D2*E2"); // 设置计算公式// 5.5 获取第六列计算公式的值HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(workbook);cell5 = e.evaluateInCell(cell5);System.out.println(cell5.getNumericCellValue());// 6、写出数据关闭资源
// 设置默认选中的工作表workbook.setActiveSheet(0);workbook.write(outputStream);outputStream.close();}
}
执行代码:
public static void main(String[] args) throws Exception {poiUtils poiUtils = new poiUtils();
// 写出文件poiUtils.poiWrite();
// 读取文件
// List read = poiUtils.getRead();
// System.out.println("读取桌面文件的内容为");
// System.out.println(read);
}
执行结果:
在桌面生成 testexcel.xls 文件

打开生成的 testexcel.xls文件

3、Demo2:导入EXCEL表格
从本地导入EXCEL表格中的内容,并将结果封装到List集合中,为了方便阅读,这里把异常都抛出,实际情况下,应该对异常进行捕获,并进行处理;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;import javax.swing.filechooser.FileSystemView;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;public class poiUtils {public List getRead() throws Exception {
// 1、获取文件的路径
// 1.1、从桌面获取文件FileSystemView fsv = FileSystemView.getFileSystemView();String desktop = fsv.getHomeDirectory().getPath();String filePath = desktop + "/testexcel.xls";
// 1.2、从绝对路径获取文件
// String filePath = "D:\\testexcel.xls";// 2、通过流获取本地文件FileInputStream fileInputStream = new FileInputStream(filePath);BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);POIFSFileSystem fileSystem = new POIFSFileSystem(bufferedInputStream);// 3、创建工作簿对象,并获取工作表1HSSFWorkbook workbook = new HSSFWorkbook(fileSystem);HSSFSheet sheet = workbook.getSheet("Sheet1");// 4、从工作表中获取行数,并遍历int lastRowIndex = sheet.getLastRowNum();System.out.println("总行数为:" + lastRowIndex);ArrayList<HashMap> list = new ArrayList<>();for (int i = 1; i <= lastRowIndex; i++) {
// 4.1 获取每行的数据HSSFRow row = sheet.getRow(i);if (row == null) {break;}// 5、从每一列中获取参数HashMap<String, String> map = new HashMap<>();short lastCellNum = row.getLastCellNum();System.out.println("总列数为:" + lastRowIndex);for (int j = 0; j < lastCellNum; j++) {
// 设置返回值的类型row.getCell(j).setCellType(Cell.CELL_TYPE_STRING);
// 获取每列的数据String cellValue = row.getCell(j).getStringCellValue();System.out.println(cellValue);switch (j) {case 0:map.put("english", cellValue);break;case 1:map.put("chinese", cellValue);break;case 2:map.put("codechinese", cellValue);break;default:break;}}
// 将最后的结果封装到List集合中list.add(map);}
// 6、关闭资源、输出封装数据bufferedInputStream.close();System.out.println(list.toString());return list;}
}
执行代码:
读取桌面生成的 testexcel.xls文件
public static void main(String[] args) throws Exception {poiUtils poiUtils = new poiUtils();
// 写出文件
// poiUtils.poiWrite();
// 读取文件List read = poiUtils.getRead();System.out.println("读取桌面文件的内容为");System.out.println(read);
}
执行结果:

4、Demo3:通过web接口传递EXCEL表格
这个是集成在spring boot里面的,直接放在web就可以直接运行调用了。
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import java.io.BufferedInputStream;
import java.io.InputStream;@RestController
@RequestMapping("/excel")
public class TestController {private static final Logger logger = LogManager.getLogger(TestController.class);/*** 接受POSTman发送的EXCEL数据** @param* @return*/@RequestMapping(value = "/upload", method = {RequestMethod.POST})public void selectOne(@RequestParam("file") MultipartFile file) throws Exception {
// 1、通过流操作,将传入的数据转为EXCEL对象InputStream inputStream = file.getInputStream();BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);POIFSFileSystem fileSystem = new POIFSFileSystem(bufferedInputStream);// 2、获取工作表0HSSFWorkbook workbook = new HSSFWorkbook(fileSystem);
// HSSFWorkbook workbook = new HSSFWorkbook(file.getInputStream());HSSFSheet sheet = workbook.getSheetAt(0);// 3、获取工作表0的行数,并遍历每一行int lastRowNum = sheet.getLastRowNum();for (int i = 1; i <= lastRowNum; i++) {
// 获取当行对象HSSFRow row = sheet.getRow(i);// 4、通过行对象,获取表格单元格的数据double id = row.getCell(0).getNumericCellValue();
// 获取String类型的数据,要先设置获取的数据的类型row.getCell(1).setCellType(Cell.CELL_TYPE_STRING);String name = row.getCell(1).getStringCellValue();double value = row.getCell(2).getNumericCellValue();logger.info("第一列:{},第二列:{},第三列:{}",id,name,value);}}
}
五、工具类
工具类代码
https://download.csdn.net/download/weixin_44624117/85421584
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
