相关的介绍参考自:http://zc985552943.iteye.com/blog/1491546

一、概述

  1.概念

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

//上述基本都是接口

//一个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();

  2.POI简介

      官网:http://poi.apache.org/

    官方API:http://poi.apache.org/apidocs/index.html

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

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

    

    能干什么?

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

   怎么干?

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

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

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

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>

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

<poi.version>3.9</poi.version>

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

  

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

  3.创建行和单元格

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

  

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

  

  单元格创建其他值的示例

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

三、单元格数据格式

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

  效果:

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

 调整为时间样式:

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

  

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

  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;
}

   

  

  //时间样式遍历待更新

  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;

  

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

  效果:

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

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

  效果:

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

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

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

  效果:

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

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

  效果:

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

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

  效果:

  3.单元格使用换行

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

  

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

  效果:

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

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

  效果:

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

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

Java使用POI导出excel(上)——基本操作的更多相关文章

  1. Java之POI导出Excel(一):单sheet

    相信在大部分的web项目中都会有导出导入Excel的需求,今天我们就来看看如何用Java代码去实现 用POI导出Excel表格. 一.pom引用 pom文件中,添加以下依赖 查看代码  <!-- ...

  2. java解决poi导出excel文字水印,导出excel不可操作问题

    首先需求是用户提出导出excel数据需使用水印备注其用途: 其实就是在导出excel的同时带有自定义文字水印的导出. 那么我们首先想到的肯定是以一个什么样的思路去解决该问题,首先查找poi导出exce ...

  3. java使用poi导出excel

    继上一篇导出pdf,这篇导出excel. 1.导入依赖 <dependency> <groupId>org.apache.poi</groupId> <art ...

  4. Java使用POI导出excel(下)——实例与小技巧

    [更新]:thinkgem的导出工具类: /** * Copyright © 2012-2016 <a href="https://github.com/thinkgem/jeesit ...

  5. java springmvc poi 导出Excel,先简单记录,后期会详细描写

    POI jar包下载 : http://poi.apache.org/download.html jsp代码 <%@ page language="java" content ...

  6. Java之POI导出Excel(二):多个sheet

    相信在大部分的web项目中都会有导出导入Excel的需求,之前我也写过一篇导出单个sheet工作表的文章,没看过的小伙伴可以去看哈,链接也给大家放出来了:导出单个sheet 但是在我们日常的工作中,需 ...

  7. Java之Poi导出Excel文档

    一.Poi简介 在后台管理系统中,我们经常要做的导出操作,通常导出为Excel文档的形式,而Poi则提供了这种需要的支持. 二.Workbook/HSSFWorkbook/XSSFWorkbook 1 ...

  8. java用POI导出Excel

    架构SSM + Maven 一.添加依赖: <dependency> <groupId>org.apache.poi</groupId> <artifactI ...

  9. java 使用poi导出Excel,设置单元格保护不可编辑

    //sheet表加密:等效excel的审阅菜单下的保护工作表 sheet.protectSheet(new String("333"));//333是密码 更多设置请参考:http ...

随机推荐

  1. August 09th 2017 Week 32nd Wednesday

    Find hope from despair, life will become brilliant. 从绝望中寻找希望,人生终将辉煌. Have you ever seen the movie Ba ...

  2. HomeBrew 使用国内数据源

    使用中科大源 1.替换默认源 替换USTC镜像: cd "$(brew --repo)" git remote set-url origin https://mirrors.ust ...

  3. 使用jenkins SonarQube gitlab 构建自动化发布系统

    目前持续集成的生态越来越完善,工具也有很多,开源的或商业的.如: 最最流行的,也是使用最多的 Jenkins 有着持续集成DNA的ThoughtWorks GO.理念:"Deployment ...

  4. web-ctf随机数安全

    rand() 函数在产生随机数的时候没有调用 srand(),则产生的随机数是有规律可询的. 产生的随机数可以用下面这个公式预测 : state[i] = state[i-3] + state[i-3 ...

  5. Sublime Text 3中设置不记住上次打开的文件

    转自:https://blog.csdn.net/nicholaszao/article/details/79575251 在”User/Preferences.sublime-settings”配置 ...

  6. 【nodejs】学习笔记

    学习链接:http://www.cnblogs.com/zhongweiv/p/nodejs_environment.html (一)简介及环境安装 Node.js是让Javascript脱离浏览器运 ...

  7. Dubbo实践(十二)Refer

    Spring在启动Dubbo客户端应用时,会实例化ReferenceBean<T>并设置配置属性,然后调用ReferenceConfig中的get方法: public synchroniz ...

  8. 非法字符:“\ufeff”

    解决方法 将编码格式UTF-8+BOM文件转为普通的UTF-8文件. 用Notepad++打开文件,将编码从UTF-8+BOM改为UTF-8

  9. 在CentOS上安装node.js的时候报错:No acceptable C compiler found!解决办法

    在CentOS上安装node.js的时候报错:No acceptable C compiler found! 原因:没有c编译器. 解决办法:安装GCC 命令如下: #yum install gcc ...

  10. Token ,Cookie和Session的区别

    在做接口测试时,经常会碰到请求参数为token的类型,但是可能大部分测试人员对token,cookie,session的区别还是一知半解. Cookie cookie 是一个非常具体的东西,指的就是浏 ...