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):创建一个新的Sheet
  • HSSFSheet getSheet(String sheetName):通过名称获取Sheet
  • HSSFSheet 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():获取最后的行的索引,没有行或者只有一行的时候返回0
  • setColumnWidth(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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部