热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

poi导出word表格的操作讲解

这篇文章主要介绍了poi导出word表格的操作讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

一、效果如下

二、js代码

function export_word(){ //导出word
  var url = "czzsca/exportWord.do";
  this.export(url);
}
function export(url){
  var currentyear = $("#mainYear").val() * 1;
  var key_columns = ['xh',"d_name","d_unit","d_number","d_estimate","d_lastyear","jnjh","d_remarks","d_depart","d_executeunit"];
  var value_columns = ['序号','项目名称','单位','数量','总概算','至'+(currentyear-1)+'年完成',currentyear+'年计划','附注','责任部门','计划执行单位'];
  window.location.href= url+"?key_columns="+key_columns+"&value_columns="+value_columns+"&title="+currentyear+"年 更新改造计划 正式计划草案";
}

三、controller代码

(controller代码比较长,主要是格式化每一行的数据,主要是往工具类里传List>参数,泛型的List是每一行,String是每一列)

 //导出word
 @RequestMapping("/exportWord.do")
 @ResponseBody
 public ReturnMsg exportWord(String[] key_columns,String[] value_columns,String title,HttpServletResponse response){
 ReturnMsg rm = new ReturnMsg();
 try {
  response.setCharacterEncoding("UTF-8");
     response.setContentType("application/msexcle");  
     response.setHeader("content-disposition", "attachment;filename="+new String("正式计划草案".getBytes("gb2312"),"ISO8859-1")+".doc");
     List> cOntent= new ArrayList>();
     List> head = new ArrayList>();
     String jnjhzh = new BigDecimal(this.map.get("jnjhzh")==null||"".equals(this.map.get("jnjhzh")+"")?"0":this.map.get("jnjhzh")+"").setScale(1, RoundingMode.UP)+"";
     String trimpro = new BigDecimal(this.map.get("tzjh")==null||"".equals(this.map.get("tzjh")+"")?"0":this.map.get("tzjh")+"").setScale(1, RoundingMode.UP)+"";
     String temp = new BigDecimal(trimpro).subtract(new BigDecimal(jnjhzh))+"";
     if("0".equals(temp)) {
     temp = "";
     }
     head = ExportUtil.getCzzscaList(jnjhzh, trimpro, temp);
     Map dounit = new HashMap();
     dounit.put("dwlx", 0);
     dounit.put("user_type", 1);
      List d_executeunit = unitDao.selectByPrimaryKey(dounit);
      Map zrbm = new HashMap();
      zrbm.put("dwlx", 1);
      zrbm.put("user_type", 1);
      List d_zrbm = unitDao.selectByPrimaryKey(zrbm);
      List zmtype = nd_caController.findProType("2-3-4");
     for (Map map: this.list) {
       List row = new ArrayList();
       for (int i = 0; i -1) {
        row.add(map.get("xh").toString().replace("、", "").trim());
        }else {
        row.add(map.get("xh")+""); //不为整数则四舍五入
     }
   }else if("tzjh".equals(key_columns[i])&&map.get("tzjh")!=null) { 
   if(ExportUtil.isNumeric(tzjh+"")) { //判断相减是否为整数
    row.add(tzjh+"");
      }else {
       String stzjh = tzjh.setScale(1, RoundingMode.UP)+"";
       row.add("0".equals(stzjh.charAt(stzjh.indexOf(".")+1)+"")?stzjh.replace(".0", ""):stzjh);//不为整数则四舍五入
   }
   }else if("d_estimate".equals(key_columns[i])&&map.get("d_estimate")!=null) { 
   if("0".equals(map.get("d_estimate")+"")) {
    row.add("");
   }else {
    row.add(map.get("d_estimate")+"");
   }
   }else if("d_number".equals(key_columns[i])&&map.get("d_number")!=null) { 
   if("0".equals(map.get("d_number")+"")) {
    row.add("");
   }else {
    row.add(map.get("d_number")+"");
   }
   }else if("jnjh".equals(key_columns[i])&&map.get("jnjh")!=null) { 
   if(ExportUtil.isNumeric(jnjh+"")) { //判断相减是否为整数
    row.add(jnjh+"");
      }else {
       String sjnjh = jnjh.setScale(1, RoundingMode.UP)+"";
       row.add("0".equals(sjnjh.charAt(sjnjh.indexOf(".")+1)+"")?sjnjh.replace(".0", ""):sjnjh); //不为整数则四舍五入
   }
   }else if("d_pro_type".equals(key_columns[i])&&map.get("d_pro_type")!=null) { 
   for (Map m : zmtype) {
    if((map.get("d_pro_type")+"").equals(m.get("TYPE_ID")+"")){
    row.add(m.get("NUM")+"");
    break;
    }
   }
       }else if("d_depart".equals(key_columns[i])&&map.get("d_depart")!=null) { 
        String d_depart = map.get("d_depart")+"";
        String depart = "";
        for (Map m : d_zrbm) {
        if((d_depart).indexOf(",")>-1) {
         for (String string : d_depart.split(",")) {
         if((string).equals(m.get("ID")+"")) {
          depart += ","+m.get("UNITNAME")+"";
          break;
           }
    }
        }else {
         if((d_depart).equals(m.get("ID")+"")) {
         depart = ","+m.get("UNITNAME")+"";
         break;
         }
        }
   }
        if (StringUtils.isNotBlank(depart)) {
        depart = depart.substring(1, depart.length()).replace(",", "\r ");
        row.add(depart);
   }else {
    row.add("");
   }
   }else if("d_executeunit".equals(key_columns[i])&&map.get("d_executeunit")!=null) { 
   boolean flag;
        for (Map m : d_executeunit) {
        flag = false;
        String executeunit = map.get("d_executeunit")+"";
        if((executeunit).indexOf(",")>-1) {
         for (String string : executeunit.split(",")) {
         if((string).equals(m.get("ID")+"")) {
          row.add((m.get("UNITNAME")+"").trim());
           flag = true;
           break;
           }
    }
         if (flag) {
         break;
    }
         
        }else {
         if((executeunit).equals(m.get("ID")+"")) {
         row.add((m.get("UNITNAME")+"").trim());
         break;
         }
        }
   }
       }else {
        if(map.get(key_columns[i])==null) {
        row.add("");
        }else {
        row.add((map.get(key_columns[i])+"").trim());
   }
   }
    }
       content.add(row);
  }
     head.addAll(content);
     int[] colWidths = new int[] { 600, 3000, 500, 500, 800, 800 ,800,3000,800,1500}; 
  XWPFDocument document = ExportUtil.exportWord(title,value_columns, head,colWidths,1,7);
  OutputStream out = response.getOutputStream(); 
     document.write(out);
     out.close();
     rm.setCode("1");
  rm.setMsg("导出成功");
 } catch (Exception e) {
  e.printStackTrace();
  rm.setCode("0");
  rm.setMsg("导出失败,请刷新重试。");
 }
 return rm;
 }

四、工具类代码

 /**
 * 
 * @Date 2018年7月19日 上午11:19:04
 * @Description 导出word 
 * @Fcunction exportWord
 * @param title
 * @param value_columns
 * @param list
 * @return XWPFDocument
 *
 */
 public static XWPFDocument exportWord(String title,String[] value_columns, List> list,int[] colWidths,int one,int two) {
 XWPFDocument doc= new XWPFDocument();
 
 CTDocument1 document = doc.getDocument(); 
   CTBody body = document.getBody(); 
   if(!body.isSetSectPr()){ 
     body.addNewSectPr(); 
   } 
   CTSectPr section = body.getSectPr(); 
 
   if(!section.isSetPgSz()){ 
     section.addNewPgSz(); 
   } 
   CTPageSz pageSize = section.getPgSz(); 
   pageSize.setW(BigInteger.valueOf(15840));
   pageSize.setH(BigInteger.valueOf(12240));
   pageSize.setOrient(STPageOrientation.LANDSCAPE);
 
 //添加标题
   XWPFParagraph titleParagraph = doc.createParagraph();
   
   //设置段落居中
   titleParagraph.setAlignment(ParagraphAlignment.CENTER);
 
   XWPFRun titleParagraphRun = titleParagraph.createRun();
   titleParagraphRun.setText(title);
   titleParagraphRun.setColor("000000");
   titleParagraphRun.setFontSize(20);
 
   //表格
   XWPFTable ComTable = doc.createTable();
   
   //设置指定宽度
   CTTbl ttbl = ComTable.getCTTbl(); 
   CTTblGrid tblGrid = ttbl.addNewTblGrid();
   for (int i : colWidths) {
   CTTblGridCol gridCol = tblGrid.addNewGridCol(); 
   gridCol.setW(new BigInteger(i+"")); 
 }
   
   //表头
   XWPFTableRow rowHead = ComTable.getRow(0);
   XWPFParagraph cellParagraph = rowHead.getCell(0).getParagraphs().get(0);
   cellParagraph.setAlignment(ParagraphAlignment.CENTER); //设置表头单元格居中
   XWPFRun cellParagraphRun = cellParagraph.createRun();
 cellParagraphRun.setFontSize(10); //设置表头单元格字号
 cellParagraphRun.setBold(true); //设置表头单元格加粗
 cellParagraphRun.setText(value_columns[0]);
   for (int i = 1; i -1) {
    cellParagraph = rowHead.addNewTableCell().getParagraphs().get(0);
    cellParagraph.setAlignment(ParagraphAlignment.CENTER); //设置表头单元格居中
    cellParagraphRun = cellParagraph.createRun();
  cellParagraphRun.setFontSize(10); //设置表头单元格居中
  cellParagraphRun.setBold(true);
  cellParagraphRun.setText("增减(+ / -)");
  }else {
  cellParagraph = rowHead.addNewTableCell().getParagraphs().get(0);
    cellParagraph.setAlignment(ParagraphAlignment.CENTER); //设置表头单元格居中
    cellParagraphRun = cellParagraph.createRun();
  cellParagraphRun.setFontSize(10); //设置表头单元格居中
  cellParagraphRun.setBold(true); //设置表头单元格加粗
  cellParagraphRun.setText(value_columns[i]);
  }
 }
   int rows = list.size();
   //表格内容
   for (int i = 0; i 0) {
  return false;
 }
 return true;
 }
 
 /**
 * 
 * @Date 2018年7月19日 上午11:44:48
 * @Description 正式计划草案获取前两行 
 * @Fcunction getCzzscaList
 * @param jnjhzh
 * @param trimpro
 * @param temp
 * @return List>
 *
 */
 public static List> getCzzscaList(String jnjhzh,String trimpro,String temp) {
 List> list = new ArrayList>();
 List l1 = new ArrayList(); //固定第一行
   l1.add(""); 
   l1.add("年度总计"); 
   l1.add(""); 
   l1.add(""); 
   l1.add(""); 
   l1.add(""); 
   l1.add(jnjhzh); 
   l1.add(""); 
   l1.add(""); 
   l1.add(""); 
   list.add(l1);
   List l2 = new ArrayList(); //固定第二行
   l2.add("");
   l2.add("搜索总计");
   l2.add("");
   l2.add("");
   l2.add("");
   l2.add("");
   l2.add("");
//   l2.add(trimpro+"\r100%");
   l2.add("");
   l2.add("");
   l2.add("");
   list.add(l2);
 return list;
 }

五、详解:

1.设置纸张大小

(1)创建完XWPFDocument后,默认为A4纸张,如需调整纸张大小,这里我是要用A3大小使用如下代码

XWPFDocument doc= new XWPFDocument();
CTDocument1 document = doc.getDocument(); 
CTBody body = document.getBody(); 
if(!body.isSetSectPr()){ 
  body.addNewSectPr(); 
} 
CTSectPr section = body.getSectPr(); 
 
if(!section.isSetPgSz()){ 
  section.addNewPgSz(); 
} 
CTPageSz pageSize = section.getPgSz(); 
pageSize.setW(BigInteger.valueOf(15840));
pageSize.setH(BigInteger.valueOf(12240));
pageSize.setOrient(STPageOrientation.LANDSCAPE);

(2)默认A4纸张大小的话只用XWPFDocument

XWPFDocument doc= new XWPFDocument();

(3)使用CTPageSz类需要导入ooxml-schemas的jar包(所有需要的jar包maven依赖在底部)

2.单元格列宽度

(1)每一列宽度相等自适应,不需单独设置每一列宽度的话使用如下代码

//表格
XWPFTable ComTable = doc.createTable();
//表格自适应宽度
CTTblWidth comTableWidth = ComTable.getCTTbl().addNewTblPr().addNewTblW();
comTableWidth.setType(STTblWidth.DXA);
comTableWidth.setW(BigInteger.valueOf(9072));

(2)单独设置每列宽度

//表格
XWPFTable ComTable = doc.createTable();   
//设置指定宽度
CTTbl ttbl = ComTable.getCTTbl(); 
CTTblGrid tblGrid = ttbl.addNewTblGrid();
int[] colWidths = new int[] { 600, 3000, 500, 500, 800, 800 ,800,3000,800,1500}; 
for (int i : colWidths) {
  CTTblGridCol gridCol = tblGrid.addNewGridCol(); 
  gridCol.setW(new BigInteger(i+"")); 
}

(3)使用CTTblGrid类需要导入poi-ooxml-schemas的jar包(所有需要的jar包maven依赖在底部)

3.单元格内字体样式

(1)不需要设置单元格字体

for (int i = 0; i 

(2)设置单元格内字体字号、是否加粗

for (int i = 0; i 

4.单元格居中(水平居中、垂直居中)

(1)使用单元格加载内容

for (int i = 0; i 

(2)使用单元格的段落加载内容,只用调用垂直居中的方法

for (int i = 0; i 

水平居中在3-(2)里调用了段落的方法居中过了

cellParagraphC.setAlignment(ParagraphAlignment.CENTER);

5.单元格合并

(1)跨列合并单元格

public static void mergeCellsHorizontal(XWPFTable table, int row, int fromCell, int toCell) {
 for (int cellIndex = fromCell; cellIndex <= toCell; cellIndex++) {
  XWPFTableCell cell = table.getRow(row).getCell(cellIndex);
  if ( cellIndex == fromCell ) {  
  cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
  } else {
  cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
  }
 }
 }

(2)跨行合并单元格

public static void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
 for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
  XWPFTableCell cell = table.getRow(rowIndex).getCell(col);
  if ( rowIndex == fromRow ) {
  cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
  } else {
  cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
  }
 }
 }

6.单元格内换行,单元格内使用\r换行没用,可以用addBreak方法

 for (int i = 0; i  -1) {
   String[] text = content.split("\r");
   for (int k = 0; k 

六、使用到的Maven依赖


  org.apache.xmlbeans
  xmlbeans
  2.6.0


  org.apache.poi
  poi-ooxml
  3.9


  org.apache.poi
  ooxml-schemas
  1.1


  org.apache.poi
  poi-ooxml-schemas
  3.16

以上这篇poi导出word表格的操作讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


推荐阅读
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
  • 本文介绍如何在Java项目中使用Log4j库进行日志记录。我们将详细说明Log4j库的引入、配置及简单应用,帮助开发者快速上手。 ... [详细]
  • 本文详细介绍了如何在ECharts中使用线性渐变色,通过echarts.graphic.LinearGradient方法实现。文章不仅提供了完整的代码示例,还解释了各个参数的具体含义及其应用场景。 ... [详细]
  • 本文详细介绍了如何解决MyBatis中常见的BindingException错误,提供了多种排查和修复方法,确保Mapper接口与XML文件的正确配置。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文探讨了在通过 API 端点调用时,使用猫鼬(Mongoose)的 findOne 方法总是返回 null 的问题,并提供了详细的解决方案和建议。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 探讨了小型企业在构建安全网络和软件时所面临的挑战和机遇。本文介绍了如何通过合理的方法和工具,确保小型企业能够有效提升其软件的安全性,从而保护客户数据并增强市场竞争力。 ... [详细]
  • 本文详细介绍了如何准备和安装 Eclipse 开发环境及其相关插件,包括 JDK、Tomcat、Struts 等组件的安装步骤及配置方法。 ... [详细]
  • 在本周的白板演练中,Apache Flink 的 PMC 成员及数据工匠首席技术官 Stephan Ewen 深入探讨了如何利用保存点功能进行流处理中的数据重新处理、错误修复、系统升级和 A/B 测试。本文将详细解释保存点的工作原理及其应用场景。 ... [详细]
  • HBase运维工具全解析
    本文深入探讨了HBase常用的运维工具,详细介绍了每种工具的功能、使用场景及操作示例。对于HBase的开发人员和运维工程师来说,这些工具是日常管理和故障排查的重要手段。 ... [详细]
author-avatar
曦雯天使
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有