*******************************

excel表格导出,使用POI实现

*******************************

实现导出步骤

——配置导出excel模板,推荐使用03版xls格式,可以兼容高级版本

——处理导出数据List<Map<String, String>>

private List<Map<String, String>> getData(){
List<Map<String, String>> data = new ArrayList<>();
Map<String, String> map = null;
for (int i = 0; i < 5; i++) {
map = new HashMap<String, String>();
map.put("listNo", i + "");
map.put("userName", "name" + i);
map.put("userAge", "" + (i + 20));
data.add(map);
}
return data;
}

——获取模板xls文件,通过输入流读到HSSFWorkbook 对象中

private HSSFWorkbook workbookTemplate() {
File file = new File("f:/etom/pmms/src/test/resources/bdRoute.xls");
InputStream is = null;
HSSFWorkbook workbook = null;
try {
is = new FileInputStream(file);
workbook = new HSSFWorkbook(is);
} catch (IOException e) {
e.printStackTrace();
}finally {
if (null != is) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
} }
}
return workbook;
}

——通过页签名获取页签

private HSSFSheet getSheet(HSSFWorkbook workbook) {
String sheetName = "用户信息";
HSSFSheet sheet = workbook.getSheet(sheetName);
if (null != sheet) {
return sheet;
}
return null;
}

——获取规则,如${userName}

private String getValue(HSSFCell cell){
int type = cell.getCellType();
switch (type) {
case Cell.CELL_TYPE_NUMERIC:
return Double.toString(cell.getNumericCellValue());
case Cell.CELL_TYPE_BOOLEAN:
return Boolean.toString(cell.getBooleanCellValue());
case Cell.CELL_TYPE_STRING:
return cell.getStringCellValue();
default:
return "";
}
}

——设置规则,如${userName}

private void setCellRule(HSSFRow firstDataRow, HSSFRow newRow) {
HSSFCell cellInRule = null;
HSSFCell newCell = null;
for (int i = 0, cellNum = firstDataRow.getLastCellNum(); i < cellNum; i++) {
cellInRule = firstDataRow.getCell(i);
newCell = newRow.createCell(i);
HSSFCellStyle style = cellInRule.getCellStyle();
newCell.setCellStyle(style);
String rule = getValue(cellInRule);
newCell.setCellValue(rule);
}
}

——设置页签模板,将内容行复制,行数与数据data的条数一致

// loop复制行的根据,rowCount复制多少行,上面截图中,复制行是从行号为4开始
private void setSheet(HSSFSheet sheet, int loop, int rowCount) {
HSSFRow newRow = null;
HSSFRow firstDataRow = sheet.getRow(loop - 1);
for (int i = loop, maxRow = loop + rowCount; i < maxRow - 1; i++) {
newRow = sheet.createRow(i);
setCellRule(firstDataRow, newRow);
}
}

——具体设置单元格内容

private void setCellValue(HSSFRow row, Map<String, String> rowData) {
for (int i = 0, cellNum = row.getLastCellNum(); i < cellNum; i++) {
HSSFCell cell = row.getCell(i);
if (null == cell) {
continue;
}
String oldValue = getValue(cell);
Pattern pattern = Pattern.compile(patternRule);
Matcher matcher = pattern.matcher(oldValue);
if (matcher.find()) {
String key = matcher.group(1);
String value = rowData.getOrDefault(key, "");
cell.setCellValue(value);
}
}
}

——设置行内容(通过设置单元格内容)

// 设置内容,单元的范围是从第loop行开始,到第loop+data.size()行结束
private void setValue(HSSFSheet sheet, int loop, List<Map<String, String>> data) {
HSSFRow row = null;
for (int i = loop - 1, rowNum = loop + data.size(), index = 0; i < rowNum - 1; i++) {
row = sheet.getRow(i);
setCellValue(row, data.get(index++));
}
}

——生成excel文件,格式为xls

private void createExcel(HSSFWorkbook workbook,String targetPath){
File excelFile = new File(targetPath);
OutputStream os = null;
try {
os = new FileOutputStream(excelFile);
workbook.write(os);
} catch (IOException e) {
e.printStackTrace();
}finally {
if (null != os) {
try {
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

——测试

@Test
public void test(){
List<Map<String, String>> data = getData(); // 获取导出的数据
String templatePath = "f:/etom/pmms/src/test/resources/user.xls"; // 模板的地址
HSSFWorkbook workbook = workbookTemplate(templatePath); // 将模板转化为HSSFWorkbook对象
HSSFSheet sheet = getSheet(workbook); // 获取模板页签
setSheet(sheet, 5, data.size()); // 设置页签
setValue(sheet, 5, data); // 设置单元格内容
Long timeMillis = System.currentTimeMillis(); // 以当前时间命名导出文件名
String targetPath = String.format("f:/etom/pmms/src/test/resources/%s.xls", Long.toString(timeMillis)); // 导出文件xls地址
createExcel(workbook, targetPath); // 导出文件
}

——结果展示

——合并单元格

private void setRegion(HSSFSheet sheet){
int firstRow = 1; // 单元起始行
int lastRow = 2; // 单元格终止行
int firstCol = 3; // 单元格起始列
int lastCol = 4; // 单元格终止列
CellRangeAddress cellRangeAddress = new CellRangeAddress(firstRow, lastRow, firstCol, lastCol);
sheet.addMergedRegion(cellRangeAddress);
}

——插入图片(图片已保存在资源中)

public void insertBatch(HSSFWorkbook workbook) throws IOException {
HSSFSheet sheet = workbook.getSheetAt(0);
HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); // 获取页签绘画组件
  // 定义位置坐标对象HSSFClientAnchor,param1:向右偏移,param2:向下偏移,param3:向左偏移,param4:向上偏移,param5:起始列,param6:起始行,param7:终点列,param8:终点行
    HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) 7, (short) 7, (short) 20, (short) 20); 
ByteArrayOutputStream baos = new ByteArrayOutputStream();
File picture = new File("f:/etom/pmms/pmms/src/test/resources/user.png");
ImageIO.write(ImageIO.read(picture), "png", baos); // 通过图片流处理工具ImageIO将图片读取后保存在byte流中
    patriarch.createPicture(anchor, workbook.addPicture(baos.toByteArray(), 6)); // 绘画组件执行插入图片,param1:坐标对象,param2:图片信息,param3:图片格式 6代表png格式
File target = new File("f:/etom/pmms/pmms/src/test/resources/userPicture.xls");
workbook.write(new FileOutputStream(target));
}

POI excel导出的更多相关文章

  1. poi excel导出,下载

    poi.jar包 public void downExcel(HttpServletResponse response,Page<ShopApply> page) throws Excep ...

  2. java POI excel 导出复合样式(一个单元格两个字体)

    前言:java poi 导出 excel 时,需要设置一个单元格有多个字体样式,有点类似于富文本. 想要达到的效果(一个单元格里): 我使用的 poi 版本是 <dependency> & ...

  3. poi excel导出 xssf 带下拉框

    需求:导出之后带有二级级联的下拉框.(类似于省市). 最初的思路是怀疑是不是数组内串太多了,导出之后的excel有36行,调试的误区在于刚开始认为对行数有限制,后自己写了一个测试类,才发现不是行数,而 ...

  4. POI Excel导出样式设置

    HSSFSheet sheet = workbook.createSheet("sheetName");    //创建sheet sheet.setVerticallyCente ...

  5. 转:POI操作Excel导出

    package com.rd.lh.util.excel; import java.beans.PropertyDescriptor; import java.io.FileOutputStream; ...

  6. Java利用POI导入导出Excel中的数据

         首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...

  7. Ireport 报表导出 Poi + ireport 导出pdf, word ,excel ,htm

    Ireport 报表导出 Poi + ireport 导出pdf, doc ,excel ,html 格式 下面是报表导出工具类reportExportUtils 需要导出以上格式的报表 只需要调用本 ...

  8. excel poi 文件导出,支持多sheet、多列自动合并。

    参考博客: http://www.oschina.net/code/snippet_565430_15074 增加了多sheet,多列的自动合并. 修改了部分过时方法和导出逻辑. 优化了标题,导出信息 ...

  9. springMVC中使用POI方式导出excel至客户端、服务器实例

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 这里的方法支持导出excel至项目所在服务器,或导 ...

随机推荐

  1. ios中XMPP的搭建

    1 首先下载xmppframework这个框架 https://github.com/robbiehanson/XMPPFramework   2 环境配置 参考:https://github.com ...

  2. LeetCode(42)-Best Time to Buy and Sell Stock(卖股票)

    题目: Say you have an array for which the ith element is the price of a given stock on day i. If you w ...

  3. rubygem若干常用选项参数

    可以用gem help commands看所有支持的参数,这个比gem -h显示的全: wisy@wisy-ThinkPad-X61:~/src/ruby_src$ gem help commands ...

  4. Day8 接口与归一化设计

    接口:在程序的使用中,我不能把程序的主体直接提供给使用者,一般是提供一个接口. 为什么要使用接口: 1,接口提取了一群共同的函数,可以把接口当做一个函数的集合. 2,让子类去实现接口中的函数. 归一化 ...

  5. Web运营手记

    1.图片是给活人用户看的,相对来讲,文字是给搜索引擎看的.精华内容争取要在网站或者频道主页里面让人看到. 2.搜索引擎喜欢看的几种文字:页面标题.关键词元信息(只有Bing管点用).描述(descri ...

  6. C++笔记019:C++中的const修饰的是一个真正的常量

    原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 程序一: 我们知道数组的下标不能为变量,必须是一个确定的值.在C语言中看程序: #define a 10 int main() { //第 ...

  7. JavaScript打开新窗口被拦截问题

    新窗口打开页面,一个很常用的效果,至于代码,一般第一反应都是这么写: window.open(url); 但是主流的浏览器都会拦截这种效果(可能这些年弹窗广告太多,如果浏览器不拦截,用户受不了)   ...

  8. node七-required、缓存

    学会查API,远比会几个API更重要. 核心模块意义 -如果只是在服务器运行javascript代码,并没有多大意义,因为无法实现任何功能>读写文件.访问网络 -Node的用处在于它本身还提供可 ...

  9. HTML学习笔记5:修饰符和特殊标签

    ①修饰符:     作用:修饰显示的方式,并不改变网页的结构,需要修饰的内容写在修饰标签内     常用文字和段落修饰符: 文字斜体:<i></i>  或  <em> ...

  10. flume安装及入门实例

    1. 如何安装? 1)将下载的flume包,解压到/home/hadoop目录中 2)修改 flume-env.sh 配置文件,主要是JAVA_HOME变量设置 root@m1:/home/hadoo ...