一、概述

  Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 .NET的开发人员则可以利用NPOI (POI for .NET) 来存取 Microsoft Office文档的功能。

1.1、POI结构说明

包名称说明

  HSSF提供读写Microsoft Excel XLS格式档案的功能。

  XSSF提供读写Microsoft Excel OOXML XLSX格式档案的功能。

  HWPF提供读写Microsoft Word DOC格式档案的功能。

  HSLF提供读写Microsoft PowerPoint格式档案的功能。

  HDGF提供读Microsoft Visio格式档案的功能。

  HPBF提供读Microsoft Publisher格式档案的功能。

  HSMF提供读Microsoft Outlook格式档案的功能。

二、POI对于excel使用

2.1、创建一个excel

  1. //创建 2003 excel 格式 xls
  2. @Test
  3. public void test() throws Exception {
  4. Workbook workbook=new HSSFWorkbook();//定义一个工作薄
  5. workbook.createSheet("sheet1");//需要默认创建一个sheet,否则打开时候报错
  6. FileOutputStream out= new FileOutputStream("test.xls");
  7. workbook.write(out);
  8. out.close();
  9. }
  10. //创建 2007 以后的excel格式 xlsx
  11. @Test
  12. public void test2() throws Exception {
  13. Workbook workbook=new XSSFWorkbook();//定义一个工作薄
  14. workbook.createSheet("sheet1");//需要默认创建一个sheet,否则打开时候报错
  15. FileOutputStream out= new FileOutputStream("test.xlsx");
  16. workbook.write(out);
  17. out.close();
  18. }

2.2、基本的使用

  1. // 基本测试 创建一个sheet 一行 几列数据
  2. @Test
  3. public void testBase() throws Exception {
  4. Workbook wk=new HSSFWorkbook();//创建一个工作薄
  5. Sheet sh=wk.createSheet("第一个sheet页");//创建一个sheet页
  6. Row row=sh.createRow(0);//创建第一行
  7. Cell cell=row.createCell(0);//创建第一行的第一个单元格
  8. cell.setCellValue(1);//为第一行第一个单元格塞值
  9. row.createCell(1).setCellValue(1.2);//创建第一行第2个单元格并赋值
  10. row.createCell(2).setCellValue("这是一个字符串");//创建第一行第3个单元格并赋值
  11. row.createCell(3).setCellValue(true);//创建第一行第4个单元格并赋值
  12. FileOutputStream out= new FileOutputStream("cells和sheet页.xls");
  13. wk.write(out);
  14. out.close();
  15. }

效果

  

2.3、单元格操作

2.3.1、设置单元格边框颜色

  1. // 设置单元格边框 颜色
  2. @Test
  3. public void testCellBorderColor() throws Exception {
  4. Workbook wb=new HSSFWorkbook();//创建工作簿
  5. Sheet sh=wb.createSheet("第一个sheet页");//创建一个sheet页
  6. Row row=sh.createRow(2);//创建一行
  7. Cell cell=row.createCell(2);//创建一个单元格
  8. cell.setCellValue(4);//设置值
  9. CellStyle cellStyle=wb.createCellStyle();
  10. cellStyle.setBorderBottom(BorderStyle.THIN);//设置底部边框
  11. cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());//设置底部边框颜色
  12. cellStyle.setBorderLeft(BorderStyle.THIN);//设置左部边框
  13. cellStyle.setLeftBorderColor(IndexedColors.BLUE.getIndex());//设置左部边框颜色
  14. cellStyle.setBorderRight(BorderStyle.THIN);//设置右部边框
  15. cellStyle.setRightBorderColor(IndexedColors.RED.getIndex());//设置右部边框颜色
  16. cellStyle.setBorderTop(BorderStyle.THIN);//设置顶部边框
  17. cellStyle.setTopBorderColor(IndexedColors.ORANGE.getIndex());//设置顶部边框颜色
  18. cell.setCellStyle(cellStyle);
  19. FileOutputStream out=new FileOutputStream("test.xls");
  20. wb.write(out);
  21. out.close();
  22. }

  

2.3.2、单元格数据格式展示【string、number、日期、布尔】

  1. @Test
  2. public void testDiffCell() throws Exception {
  3. Workbook wk = new HSSFWorkbook();//创建工作薄
  4. Sheet sh = wk.createSheet();//创建sheet页
  5. Row row = sh.createRow(0);//创建第一行
  6. row.createCell(0).setCellValue(1);
  7. row.createCell(1).setCellValue("字符串");
  8. row.createCell(2).setCellValue(true);
  9. //1、日期默认为 数值
  10. row.createCell(3).setCellValue(new Date());
  11.  
  12. row.createCell(4).setCellValue(HSSFCell.ENCODING_COMPRESSED_UNICODE);
  13. row.createCell(5).setCellValue(false);
  14. //2、日期变成字符串
  15. row.createCell(6).setCellValue("2019-07-19");
  16.  
  17. //3、单元格设置日期类型样式
  18. // 定义Cell格式
  19. CellStyle cellStyle = wk.createCellStyle();
  20. CreationHelper creationHelper = wk.getCreationHelper();
  21. cellStyle.setDataFormat(
  22. creationHelper.createDataFormat().getFormat("yyyy-MM-dd hh:mm:ss")
  23. );
  24.  
  25. Cell cell = row.createCell(7);//创建一个单元格
  26. cell.setCellValue(new Date()); // 插入格式化日期
  27. cell.setCellStyle(cellStyle);
  28.  
  29. cell = row.createCell(8); // 插入格式化日期
  30. cell.setCellValue(Calendar.getInstance());
  31. cell.setCellStyle(cellStyle);
  32.  
  33. FileOutputStream out = new FileOutputStream("test.xls");
  34. wk.write(out);
  35. out.close();
  36. }

  

2.3.3、字体处理

  1. @Test
  2. public void testFont() throws Exception {
  3. Workbook workbook=new HSSFWorkbook();
  4. Sheet sheet=workbook.createSheet();
  5. Row row=sheet.createRow(1);
  6. //字体处理类
  7. Font font=workbook.createFont();
  8. font.setFontHeightInPoints((short)18);//设置字体高度
  9. font.setItalic(true);//字体是否是斜体
  10. font.setFontName("Courier New");//设置字体名字
  11.  
  12. CellStyle cellStyle=workbook.createCellStyle();
  13. cellStyle.setFont(font);
  14. Cell cell=row.createCell(1);
  15. cell.setCellValue("This is test fonts");
  16. cell.setCellStyle(cellStyle);
  17.  
  18. FileOutputStream out=new FileOutputStream("testFont.xls");
  19. workbook.write(out);
  20. out.close();
  21. } 

  

2.3.4、读取写入

  1. @Test
  2. public void testRead() throws Exception {
  3. InputStream inputStream=new FileInputStream("/Users/lihongxu6/IdeaProjects/common/common-help/test.xls");//创建一个输入流读取单元格
  4. POIFSFileSystem fileSystem=new POIFSFileSystem(inputStream);//包装类,将读取的内容放入内存中
  5. Workbook wb=new HSSFWorkbook(fileSystem);
  6. Sheet sheet=wb.getSheetAt(0);//获取第一个sheet页
  7. Row row=sheet.getRow(0);//获取第一行
  8. Cell cell=row.getCell(0);//获取第一个单元格
  9. if(cell == null||"".equals(cell)) {
  10. cell=row.createCell(3);
  11. }
  12. cell.setCellType(Cell.CELL_TYPE_STRING);
  13. cell.setCellValue("测试单元格");
  14.  
  15. FileOutputStream out=new FileOutputStream("test.xls");
  16. wb.write(out);
  17. out.close();
  18. inputStream.close();
  19. }

   →  

2.3.5、数据格式化

  1. @Test
  2. public void testDataStyle() throws Exception {
  3. Workbook workbook=new HSSFWorkbook();
  4. Sheet sheet=workbook.createSheet("第一个sheet页");
  5. CellStyle style;
  6. DataFormat format=workbook.createDataFormat();
  7. Row row;
  8. Cell cell;
  9.  
  10. short rowNum=0;
  11. short cellNume=1;
  12.  
  13. row=sheet.createRow(rowNum++);
  14. cell=row.createCell(cellNume);
  15. cell.setCellValue(111111.25);
  16.  
  17. style=workbook.createCellStyle();
  18. style.setDataFormat(format.getFormat("0.0"));
  19. cell.setCellStyle(style);
  20.  
  21. row=sheet.createRow(rowNum++);
  22. cell=row.createCell(cellNume);
  23. cell.setCellValue(11111111.25);
  24.  
  25. style=workbook.createCellStyle();
  26. style.setDataFormat(format.getFormat("#,##0.000"));
  27. cell.setCellStyle(style);
  28.  
  29. FileOutputStream out=new FileOutputStream("testDataStyle.xls");
  30. workbook.write(out);
  31. out.close();
  32. }

  

2.3.6、文本提取

  1. @Test
  2. public void testText() throws Exception {
  3. InputStream in= new FileInputStream("/Users/lihongxu6/IdeaProjects/common/common-help/test.xls");
  4. POIFSFileSystem pfs=new POIFSFileSystem(in);
  5. HSSFWorkbook hwb=new HSSFWorkbook(pfs);
  6. ExcelExtractor excelExtractor=new ExcelExtractor(hwb);//提取文本
  7. excelExtractor.setIncludeSheetNames(false);//不需要sheet页名字
  8. System.out.println(excelExtractor.getText());
  9. in.close();
  10. }

输出

  1. 测试单元格 字符串 true 43665.45162 0 false 2019-07-19 2019-07-19 10:50:20 2019-07-19 10:50:20

2.3.7、遍历数据

  1. @Test
  2. public void testItor() throws Exception {
  3.  
  4. InputStream in= new FileInputStream("/Users/lihongxu6/IdeaProjects/common/common-help/test.xls");
  5. POIFSFileSystem pfs=new POIFSFileSystem(in);//文件系统可接受一个输入流
  6. HSSFWorkbook hwb=new HSSFWorkbook(pfs);
  7. HSSFSheet sheet=hwb.getSheetAt(0);//获取第一个sheet页
  8. if(sheet == null) {
  9. return;
  10. }
  11. //遍历row
  12. for(int rowNum= 0;rowNum <= sheet.getLastRowNum();rowNum++) {
  13. HSSFRow hssfRow=sheet.getRow(rowNum);
  14. if(hssfRow== null) {
  15. continue;
  16. }
  17. //遍历cells
  18. for(int cellNum=0;cellNum <= hssfRow.getLastCellNum();cellNum++) {
  19. HSSFCell hssfcell=hssfRow.getCell(cellNum);
  20. if(hssfcell== null) {
  21. continue;
  22. }
  23. System.out.print(" "+getValue(hssfcell));
  24. }
  25. System.out.println();
  26. }
  27. in.close();
  28. }
  29. /**
  30. * 判断cell的数据格式
  31. * @param hssfcell
  32. * @return
  33. */
  34. private static String getValue(HSSFCell hssfcell) {
  35. if(hssfcell.getCellType() ==HSSFCell.CELL_TYPE_BOOLEAN ) {
  36. return String.valueOf(hssfcell.getBooleanCellValue());
  37. }else if(hssfcell.getCellType() ==HSSFCell.CELL_TYPE_NUMERIC ) {
  38. return String.valueOf(hssfcell.getNumericCellValue());
  39. }else {
  40. return String.valueOf(hssfcell.getStringCellValue());
  41. }
  42. }

输出

  1. 测试单元格 字符串 true 43665.45161912037 0.0 false 2019-07-19 43665.45162721065 43665.45162721065

2.3.8、单元格对齐方式

  1. @Test
  2. public void testAlign() throws Exception {
  3. Workbook wb=new HSSFWorkbook();//创建工作薄
  4. Sheet sh=wb.createSheet();//创建sheet页
  5. Row row=sh.createRow(2);//创建一行
  6. row.setHeightInPoints(30);//设置行高
  7.  
  8. createCell(wb,row,(short)0,HorizontalAlignment.CENTER,VerticalAlignment.BOTTOM);
  9. createCell(wb,row,(short)1,HorizontalAlignment.CENTER_SELECTION,VerticalAlignment.CENTER);
  10. createCell(wb,row,(short)2,HorizontalAlignment.FILL,VerticalAlignment.JUSTIFY);
  11. createCell(wb,row,(short)3,HorizontalAlignment.GENERAL,VerticalAlignment.TOP);
  12. FileOutputStream out=new FileOutputStream("testAlign.xls");
  13. wb.write(out);
  14. out.close();
  15. }
  16.  
  17. /**
  18. * 设置单元格对齐方式
  19. * @param wb 工作薄
  20. * @param row 行
  21. * @param column 列
  22. * @param halign 水平
  23. * @param valign 垂直
  24. */
  25. private static void createCell(Workbook wb,Row row,short column,HorizontalAlignment halign,VerticalAlignment valign) {
  26. Cell cells=row.createCell(column);//创建单元格
  27. cells.setCellValue(new HSSFRichTextString("Align it"));//设置值
  28. CellStyle cellstyle=wb.createCellStyle();//创建单元格样式
  29. cellstyle.setAlignment(halign);//设置单元格水平方向对齐方式
  30. cellstyle.setVerticalAlignment(valign);//设置单元格垂直方向对齐方式
  31. cells.setCellStyle(cellstyle);//设置单元格样式
  32. }

  

2.3.9、单元格背景色

  1. @Test
  2. public void testBg() throws Exception {
  3. Workbook wb=new HSSFWorkbook();
  4. Sheet sheet=wb.createSheet("第一个Sheet页");
  5. Row row=sheet.createRow(2);
  6.  
  7. Cell cell=row.createCell(1);
  8. cell.setCellValue("xx");
  9. CellStyle cellStyle=wb.createCellStyle();
  10. cellStyle.setFillBackgroundColor(IndexedColors.GREEN.getIndex());//前景色
  11. cellStyle.setFillPattern(FillPatternType.BIG_SPOTS);
  12. cell.setCellStyle(cellStyle);
  13.  
  14. Cell cell2=row.createCell(3);
  15. cell2.setCellValue("yy");
  16. CellStyle cellStyle2=wb.createCellStyle();
  17. cellStyle2.setFillForegroundColor(IndexedColors.PINK.getIndex());//背景色
  18. cellStyle2.setFillPattern(FillPatternType.SPARSE_DOTS);
  19. cell2.setCellStyle(cellStyle2);
  20.  
  21. FileOutputStream out=new FileOutputStream("testBg.xls");
  22. wb.write(out);
  23. out.close();
  24. }

  

2.3.9、单元格换行

  1. @Test
  2. public void testLine() throws Exception {
  3. Workbook workbook=new HSSFWorkbook();
  4. Sheet sheet=workbook.createSheet();
  5. Row row=sheet.createRow(0);
  6. Cell cell=row.createCell(2);
  7. cell.setCellValue("我要换行了\n有没有成功?");
  8.  
  9. CellStyle cellStyle=workbook.createCellStyle();
  10. cellStyle.setWrapText(true);//设置可以换行
  11. cell.setCellStyle(cellStyle);
  12.  
  13. row.setHeightInPoints(2*sheet.getDefaultRowHeightInPoints());//设置2倍的行高
  14. sheet.autoSizeColumn(2);//设置单元格宽度
  15.  
  16. FileOutputStream out=new FileOutputStream("testLine.xls");
  17. workbook.write(out);
  18. out.close();
  19. }

  

2.3.10、单元格合并居中

  1. @Test
  2. public void testSpan() throws Exception {
  3. Workbook wb=new HSSFWorkbook();//创建工作薄
  4. Sheet sheet=wb.createSheet();//创建sheet页
  5. Row row=sheet.createRow(1);//创建行
  6.  
  7. Cell cell=row.createCell(1);//创建单元格
  8. cell.setCellValue("单元格合并测试");
  9. /**
  10. * 合并单元格的API
  11. */
  12. sheet.addMergedRegion(new CellRangeAddress(
  13. 1,//起始行
  14. 2,//结束行
  15. 1,//起始列
  16. 2//结束列
  17. ));
  18. CellStyle cellStyle=wb.createCellStyle();
  19. cellStyle.setAlignment(HorizontalAlignment.CENTER);
  20. cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  21. cell.setCellStyle(cellStyle);
  22.  
  23. FileOutputStream out=new FileOutputStream("testSpan.xls");
  24. wb.write(out);
  25. out.close();
  26. }

  

001-poi-excel-基础、单元格使用操作的更多相关文章

  1. C#实现对EXCEL指定单元格进行操作

    using System; using System.Collections.Generic; using System.Text; using Microsoft.Office.Interop.Ex ...

  2. POI/Excel/HTML单元格公式问题

    一.问题描述 使用MyBatis从数据库中获取数据,然后用POI把数据填充到Excel模板中,生成最终的xls文件.把最终的xls文件转换为html文件,并返回给前台显示在Panel中. Excel模 ...

  3. poi excel 合并单元格

    结论:final CellRangeAddress cra = new CellRangeAddress(rowId, rowId + rowSkip,        colId, colId + c ...

  4. ASP.NET 导出gridview中的数据到Excel表中,并对指定单元格换行操作

    1. 使用NPOI读取及生成excel表. (1)导出Click事件: 获取DataTable; 给文件加文件名: string xlsxName = "xxx_" + DateT ...

  5. [从产品角度学EXCEL 03]-单元格的秘密

    这是<从产品角度学EXCEL>系列——单元格的秘密. 前言请看: 0 为什么要关注EXCEL的本质 1 EXCEL是怎样运作的 2 EXCEL里的树形结构 或者你可以去微信公众号@尾巴说数 ...

  6. POI按照源单元格设置目标单元格格式

    原文:http://jjw198874.blog.163.com/blog/static/1889845522011102401854234/ POI按照源单元格设置目标单元格格式 poi按照一个源单 ...

  7. POI设置excle单元格样式

    Java利用POI生成Excel强制换行 使用POI创建一个简单的   myXls.xls   文件       常用的包为   org.apache.poi.hssf.usermodel.*;    ...

  8. Excel的单元格设置下拉选项并填充颜色

    如何在Excel的单元格中加入下拉选项   方法/步骤     第一步:打开excel文档,选中需加入下拉选项的单元格.      第二步:点击菜单中的“数据”->“数据有效性”->“数据 ...

  9. Html Table用JS导出excel格式问题 导出EXCEL后单元格里的000412341234会变成412341234 7-14 会变成 2018-7-14(7月14) 自定义格式 web利用table表格生成excel格式问题 js导出excel增加表头、mso-number-format定义数据格式 数字输出格式转换 mso-number-format:"\@"

    Html Table用JS导出excel格式问题 我在网上找的JS把HTML Tabel导出成EXCEL.但是如果Table里的数字内容为0开的的导成Excel后会自动删除0,我想以text的格式写入 ...

  10. poi读取合并单元格

    poi读取合并单元格 学习了:http://blog.csdn.net/ycb1689/article/details/9764191 进行了列合并单元格的修正:原来是我自己找错了地方: import ...

随机推荐

  1. K8S 1.12大特性最快最深度解析:Kubernetes CSI Snapshot(上)

    ​ 背景 许多存储系统提供了创建存储卷“快照”(snapshot)的能力,以防止数据丢失.快照可以替代传统的备份系统来备份和还原主要数据和关键数据.快照能够快速备份数据(例如,创建GCE PD快照仅需 ...

  2. Jenkins手把手图文教程[基于Jenkins 2.164.1]

    原文:http://www.itmuch.com/work/jenkins-in-action/ 一.下载 前往https://jenkins.io/download/ ,按需下载.如用于生产,建议下 ...

  3. 运输层5——TCP报文段的首部格式

    写在前面:本文章是针对<计算机网络第七版>的学习笔记 运输层1--运输层协议概述 运输层2--用户数据报协议UDP 运输层3--传输控制协议TCP概述 运输层4--TCP可靠运输的工作原理 ...

  4. 读入 并查集 gcd/exgcd 高精度 快速幂

    ios_base::sync_with_stdio(); cin.tie(); ], nxt[MAXM << ], Head[MAXN], ed = ; inline void added ...

  5. shell 学习笔记2

    shell的常用处理:https://github.com/dylanaraps/pure-bash-bible -d作为分隔符:read xargs -t作为分隔符:sort -F作为分隔符:awk ...

  6. windows下递归删除指定文件和文件夹

    //删除文件del *.后缀 /s//删除文件夹for /r 目录 %a in (文件夹名\) do @if exist "%a" rd /s/q "%a"

  7. Java Part 001( 03_01_数据类型和运算符 )

    注释 Java语言的注释一共有三种类型,分别是单行注释.多行注释和文档注释. 1. 单行注释 单行注释就是在程序中注释一行代码,在Java语言中,使用双斜线“//”进行单行注释. 2. 多行注释 多行 ...

  8. leetcode解题报告(17):Missing Number

    描述 Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is mis ...

  9. ST表 「 从入门到入门 · 浅显理解 」

    ST 表是个好东西,虽然前些天 ldq 学长已经讲完啦,但是那天他讲了那么多,让智商受限的我完全没有全部接受,选择性的扔掉了一部分(其实不舍的扔,记不住QAQ). ST 表最简单的应用就是查询区间最大 ...

  10. centos7 浏览器(firefox)中文乱码

    主要问题在于firefox用了系统没有的字体 百度的方案: 通过yum安装中文字体 (找不到对应的库) 修改firefox的默认字体(尴尬.不知道改哪个才有效) 粗暴的解决方案: 把 windows ...