java操作Excel表格
1、介绍
当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统、银行系统)。或者是:我们已经习惯用Excel打印。这样在我们实际的开发中,很多时候需要实现导入、导出Excel的应用。
目前,比较常用的实现Java导入、导出Excel的技术有两种Jakarta POI和Java Excel
下面我就分别讲解一下如何使用这两个技术实现导入、导出Excel
2、使用Jakarta POI导入、导出Excel
Jakarta POI 是一套用于访问微软格式文档的Java API。Jakarta POI有很多组件组成,其中有用于操作Excel格式文件的HSSF和用于操作Word的HWPF,官方主页http://poi.apache.org/index.html,API文档http://poi.apache.org/apidocs/index.html
2.1下载jar
- 官方下载:http://poi.apache.org/download.html这里可以下载到它的最新版本和文档
- 将根目录下的poi-3.6-20091214.jar和Lib目录下三个通用包 commons-logging-1.1.jar junit-3.8.1.jar log4j-1.2.13.jar拷贝到项目的Lib下
2.2maven项目添加pom依赖
<!-- 导出Excel依赖jar包 https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.6</version>
</dependency>
2.3Jakarta POI HSSF API组件
HSSF(用于操作Excel的组件)提供给用户使用的对象在rg.apache.poi.hssf.usermodel包中,主要部分包括Excel对象,样式和格式,还有辅助操作。有以下几种对象:
常用组件 | |
---|---|
HSSFWorkbook | excel的文档对象 |
HSSFSheet | excel的表单 |
HSSFRow | excel的行 |
HSSFCell | excel的格子单元 |
HSSFFont | excel字体 |
HSSFDataFormat | 日期格式 |
HSSFHeader | sheet头 |
HSSFFooter | sheet尾(只有打印的时候才能看到效果) |
常用组件 | |
---|---|
HSSFFooter | sheet尾(只有打印的时候才能看到效果) |
HSSFCellStyle | cell样式 |
辅助操作包括 | |
---|---|
HSSFDateUtil | 日期 |
HSSFPrintSetup | 打印 |
HSSFErrorConstants | 错误信息表 |
3. java导出Excel
- 创建ExcelUtil工具类
package com.dx.mecvip.util;
import java.io.UnsupportedEncodingException;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
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.ss.util.Region;
/**
1. @author fang
2. 3. @Date 2018年12月12日
4. 5. 项目名 mecvip
6. 7. @version 1.0
*/
@SuppressWarnings("deprecation")
public class ExcelUtil {
private HSSFWorkbook wb = null;// 得到Excel工作簿对象
private HSSFSheet sheet = null;// 得到Excel工作表对象
public ExcelUtil(HSSFWorkbook wb, HSSFSheet sheet) {
this.wb = wb;
this.sheet = sheet;
}
/**
* 导出Excel
*
* @param sheetName
* sheet名称
* @param title
* 标题
* @param values
* 内容
* @param wb
* HSSFWorkbook对象
* @return
*/
public static HSSFWorkbook getHSSFWorkbook(String sheetName, String[] title, String[][] values, HSSFWorkbook wb) {
// 第一步,创建一个HSSFWorkbook,对应一个Excel文件
if (wb == null) {
wb = new HSSFWorkbook();
}
// 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
HSSFSheet sheet = wb.createSheet(sheetName);
// 设置行高和行宽
sheet.setDefaultColumnWidth(25);
// sheet.setDefaultRowHeight((short)800);
// sheet.setColumnWidth(1, 100 * 256);
// 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
HSSFRow row = sheet.createRow(0);
// 第四步,创建表头单元格,并设置值表头 设置表头居中
HSSFCellStyle styleHeader = wb.createCellStyle();
styleHeader.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐
styleHeader.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐
styleHeader.setWrapText(true);// 指定单元格自动换行
// 设置表头单元格字体
HSSFFont fontHeader = wb.createFont();
fontHeader.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
fontHeader.setFontName("微软雅黑");// 字体
fontHeader.setFontHeightInPoints((short) 12);// 设置字体
styleHeader.setFont(fontHeader);
// 第五步,创建内容单元格,并设置内容单元格样式
HSSFCellStyle styleBody = wb.createCellStyle();
styleBody.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐
styleBody.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐
styleBody.setWrapText(true);// 指定单元格自动换行
// 设置表头单元格字体
HSSFFont fontBody = wb.createFont();
fontBody.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
fontBody.setFontName("仿宋");// 字体
fontBody.setFontHeightInPoints((short) 12);// 设置字体
styleBody.setFont(fontBody);
// 设置单元格背景色
// styleHeader.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
// styleHeader.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
// 声明列对象
HSSFCell cell = null;
// 创建标题
for (int i = 0; i < title.length; i++) {
// 设置标题行高度
row.setHeight((short) 800);
cell = row.createCell(i);
// 定义单元格为字符串类型
cell.setCellType(HSSFCell.ENCODING_UTF_16);// 中文处理
cell.setCellStyle(styleHeader);
cell.setCellValue(title[i]);
}
// 创建内容
for (int i = 0; i < values.length; i++) {
row = sheet.createRow(i + 1);
// 设置内容行高度
row.setHeight((short) 800);
for (int j = 0; j < values[i].length; j++) {
cell = row.createCell(j);
// 定义单元格为字符串类型
cell.setCellType(HSSFCell.ENCODING_UTF_16);// 中文处理
cell.setCellStyle(styleBody);
// 将内容按顺序赋给对应的列对象
cell.setCellValue(values[i][j]);
}
}
return wb;
}
/**
* 创建合计行
*
* @param colSum
* 需要合并到的列索引
* @param cellValue
*/
public void createLastSumRow(int colSum, List<String> list) {
// 定义单元格格式,添加单元格表样式,并添加到工作簿
HSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐
cellStyle.setWrapText(true);// 指定单元格自动换行
// 单元格字体
HSSFFont font = wb.createFont();
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
font.setFontName("宋体");
font.setFontHeight((short) 250);
cellStyle.setFont(font);
// 获取工作表最后一行
HSSFRow lastRow = sheet.createRow((short) (sheet.getLastRowNum() + 1));
HSSFCell sumCell = lastRow.createCell(0);// 创建Excel工作表指定行的单元格
sumCell.setCellValue(new HSSFRichTextString("合计"));
sumCell.setCellStyle(cellStyle);
// 合并 最后一行的第零列-最后一行的第一列
sheet.addMergedRegion(new Region(sheet.getLastRowNum(), (short) 0, sheet.getLastRowNum(), (short) colSum));// 指定合并区域
for (int i = 2; i < (list.size() + 2); i++) {
// 定义最后一行的第三列
sumCell = lastRow.createCell(i);
sumCell.setCellStyle(cellStyle);
// 定义数组 从0开始。
sumCell.setCellValue(new HSSFRichTextString(list.get(i - 2)));
}
}
// 发送响应流方法
public static void setResponseHeader(HttpServletResponse response, String fileName) {
try {
try {
fileName = new String(fileName.getBytes(), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
response.setContentType("application/octet-stream;charset=ISO8859-1");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
response.addHeader("Pargam", "no-cache");
response.addHeader("Cache-Control", "no-cache");
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
- 业务执行代码:
@SuppressWarnings("null")
@RequestMapping(value = "/exportWC.dx")
@ResponseBody
public void export(HttpServletRequest request, HttpServletResponse response) {
// 获取数据
// List<PageData> list = reportService.bookList(page);
// excel标题
String[] title = { "值班室", "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
// excel文件名
String fileName = "值班表.xls";
// sheet名
String sheetName = "值班表";
int size = roomList.size();
String[][] content = new String[size][];
/*下面是自己业务代码,将自己的表格内容(不含表头)填充到自己的Excel表格中*/
// 查询所有值班室
List<Room> roomList = roomService.selectAllRoom();
String weekdays[] = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
for (int i = 0; i < size; i++) {
for (int j = 1; j < title.length; j++) {
content[i] = new String[title.length];
content[i][0] = roomList.get(i).getName();
for (int s = 0; s < weekdays.length; s++) {
map.clear();
map.put("weekday", weekdays[s]);
map.put("rid", roomList.get(i).getId());
Workcalendar workcalendar = workcalendarService.selectWorkcalendar(map);
if (workcalendar != null) {
content[i][s + 1] = workcalendar.getUser().getName();
}
}
}
}
// 创建HSSFWorkbook
HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName, title, content, null);
// 响应到客户端
try {
ExcelUtil.setResponseHeader(response, fileName);
OutputStream os = response.getOutputStream();
wb.write(os);
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
4.java导入Excel表格
待完善。。。
可参考大神文档:https://www.cnblogs.com/hanfeihanfei/p/7079210.html