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>>参数,泛型的List<String>是每一行,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<List<String>> content = new ArrayList<List<String>>();
List<List<String>> head = new ArrayList<List<String>>();
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<Map> d_executeunit = unitDao.selectByPrimaryKey(dounit);
Map zrbm = new HashMap();
zrbm.put("dwlx", 1);
zrbm.put("user_type", 1);
List<Map> d_zrbm = unitDao.selectByPrimaryKey(zrbm);
List<Map> zmtype = nd_caController.findProType("2-3-4");
for (Map map: this.list) {
List<String> row = new ArrayList<String>();
for (int i = 0; i < key_columns.length; i++) {
System.out.print(map.get(key_columns[i])+",");
Object Otzjh = map.get("tzjh")!=null?map.get("tzjh"):0;
Object Ojnjh = map.get("jnjh")!=null?map.get("jnjh"):0;
BigDecimal tzjh = null;
BigDecimal jnjh = null;
if ("tzjh".equals(key_columns[i])||"jnjh".equals(key_columns[i])||"d_lnorde".equals(key_columns[i])) {
if(Otzjh instanceof BigDecimal) {
tzjh = (BigDecimal)Otzjh;
}else {
tzjh = new BigDecimal(Otzjh+"");
}
if(Ojnjh instanceof BigDecimal) {
jnjh = (BigDecimal)Ojnjh;
}else {
jnjh = new BigDecimal(Ojnjh+"");
} }
if ("d_lnorde".equals(key_columns[i])) {
if(map.get("flag")!=null&&"2".equals((map.get("flag")+""))) {
row.add("");
}else {
row.add(tzjh.subtract(jnjh).setScale(1, RoundingMode.UP)+""); //不为整数则四舍五入
}
}else if ("xh".equals(key_columns[i])&&map.get("xh")!=null) {
if(map.get("xh").toString().indexOf("、")>-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<String>> 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 < value_columns.length; i++) {
if(value_columns[i].indexOf("增减")>-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 < rows; i++) {
XWPFTableRow rowsContent = ComTable.createRow();
for (int j = 0; j < list.get(i).size(); j++) {
XWPFParagraph cellParagraphC = rowsContent.getCell(j).getParagraphs().get(0);
if(j!=one&&j!=two) {
cellParagraphC.setAlignment(ParagraphAlignment.CENTER); //设置表格内容居中
}
XWPFRun cellParagraphRunC = cellParagraphC.createRun();
cellParagraphRunC.setFontSize(10); //设置表格内容字号
cellParagraphRunC.setText(list.get(i).get(j)+""); //单元格段落加载内容
}
}
if(rows==0) {
for (int i = 0; i < value_columns.length; i++) {
XWPFTableCell cell = ComTable.getRow(0).getCell(i);
cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); //垂直居中
}
}else {
//设置居中
for (int i = 0; i <= rows; i++) {
for (int j = 0; j < list.get(0).size(); j++) {
XWPFTableCell cell = ComTable.getRow(i).getCell(j);
cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); //垂直居中
}
}
}
return doc;
} /**
*
* @Date 2018年7月19日 上午11:19:21
* @Description 判断是否是整数
* @Fcunction isNumeric
* @param str
* @return boolean
*
*/
public static boolean isNumeric(String str) {
if(str.indexOf(".")>0) {
return false;
}
return true;
} /**
*
* @Date 2018年7月19日 上午11:44:48
* @Description 正式计划草案获取前两行
* @Fcunction getCzzscaList
* @param jnjhzh
* @param trimpro
* @param temp
* @return List<List<String>>
*
*/
public static List<List<String>> getCzzscaList(String jnjhzh,String trimpro,String temp) {
List<List<String>> list = new ArrayList<List<String>>();
List<String> l1 = new ArrayList<String>(); //固定第一行
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<String> l2 = new ArrayList<String>(); //固定第二行
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 < rows; i++) {
XWPFTableRow rowsContent = ComTable.createRow();
for (int j = 0; j < list.get(i).size(); j++) {
rowsContent.getCell(j).setText(list.get(i).get(j)+""); //用单元格加载内容
}
}
(2)设置单元格内字体字号、是否加粗
for (int i = 0; i < rows; i++) {
XWPFTableRow rowsContent = ComTable.createRow();
for (int j = 0; j < list.get(i).size(); j++) {
XWPFParagraph cellParagraphC = rowsContent.getCell(j).getParagraphs().get(0);
if(j!=1&&j!=7) {
cellParagraphC.setAlignment(ParagraphAlignment.CENTER); //设置表格内容居中
}
XWPFRun cellParagraphRunC = cellParagraphC.createRun();
cellParagraphRunC.setFontSize(10); //设置表格内容字号
cellParagraphRun.setBold(true); //设置表头单元格加粗
cellParagraphRunC.setText(list.get(i).get(j)+""); //单元格段落加载内容
}
}
4.单元格居中(水平居中、垂直居中)
(1)使用单元格加载内容
for (int i = 0; i < value_columns.length; i++) {
XWPFTableCell cell = ComTable.getRow(0).getCell(i);
cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); //垂直居中
CTTc cttc = cell.getCTTc();
CTP ctp = cttc.getPList().get(0);
CTPPr ctppr = ctp.getPPr();
if (ctppr == null) {
ctppr = ctp.addNewPPr();
}
CTJc ctjc = ctppr.getJc();
if (ctjc == null) {
ctjc = ctppr.addNewJc();
}
ctjc.setVal(STJc.CENTER); //水平居中
}
(2)使用单元格的段落加载内容,只用调用垂直居中的方法
for (int i = 0; i < value_columns.length; i++) {
XWPFTableCell cell = ComTable.getRow(0).getCell(i);
cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); //垂直居中
}
水平居中在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);
}
}
}
六、使用到的Maven依赖
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.16</version>
</dependency>
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>>参数,泛型的List<String>是每一行,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<List<String>> content = new ArrayList<List<String>>();
- List<List<String>> head = new ArrayList<List<String>>();
- 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<Map> d_executeunit = unitDao.selectByPrimaryKey(dounit);
- Map zrbm = new HashMap();
- zrbm.put("dwlx", 1);
- zrbm.put("user_type", 1);
- List<Map> d_zrbm = unitDao.selectByPrimaryKey(zrbm);
- List<Map> zmtype = nd_caController.findProType("2-3-4");
- for (Map map: this.list) {
- List<String> row = new ArrayList<String>();
- for (int i = 0; i < key_columns.length; i++) {
- System.out.print(map.get(key_columns[i])+",");
- Object Otzjh = map.get("tzjh")!=null?map.get("tzjh"):0;
- Object Ojnjh = map.get("jnjh")!=null?map.get("jnjh"):0;
- BigDecimal tzjh = null;
- BigDecimal jnjh = null;
- if ("tzjh".equals(key_columns[i])||"jnjh".equals(key_columns[i])||"d_lnorde".equals(key_columns[i])) {
- if(Otzjh instanceof BigDecimal) {
- tzjh = (BigDecimal)Otzjh;
- }else {
- tzjh = new BigDecimal(Otzjh+"");
- }
- if(Ojnjh instanceof BigDecimal) {
- jnjh = (BigDecimal)Ojnjh;
- }else {
- jnjh = new BigDecimal(Ojnjh+"");
- }
- }
- if ("d_lnorde".equals(key_columns[i])) {
- if(map.get("flag")!=null&&"2".equals((map.get("flag")+""))) {
- row.add("");
- }else {
- row.add(tzjh.subtract(jnjh).setScale(1, RoundingMode.UP)+""); //不为整数则四舍五入
- }
- }else if ("xh".equals(key_columns[i])&&map.get("xh")!=null) {
- if(map.get("xh").toString().indexOf("、")>-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<String>> 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 < value_columns.length; i++) {
- if(value_columns[i].indexOf("增减")>-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 < rows; i++) {
- XWPFTableRow rowsContent = ComTable.createRow();
- for (int j = 0; j < list.get(i).size(); j++) {
- XWPFParagraph cellParagraphC = rowsContent.getCell(j).getParagraphs().get(0);
- if(j!=one&&j!=two) {
- cellParagraphC.setAlignment(ParagraphAlignment.CENTER); //设置表格内容居中
- }
- XWPFRun cellParagraphRunC = cellParagraphC.createRun();
- cellParagraphRunC.setFontSize(10); //设置表格内容字号
- cellParagraphRunC.setText(list.get(i).get(j)+""); //单元格段落加载内容
- }
- }
- if(rows==0) {
- for (int i = 0; i < value_columns.length; i++) {
- XWPFTableCell cell = ComTable.getRow(0).getCell(i);
- cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); //垂直居中
- }
- }else {
- //设置居中
- for (int i = 0; i <= rows; i++) {
- for (int j = 0; j < list.get(0).size(); j++) {
- XWPFTableCell cell = ComTable.getRow(i).getCell(j);
- cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); //垂直居中
- }
- }
- }
- return doc;
- }
- /**
- *
- * @Date 2018年7月19日 上午11:19:21
- * @Description 判断是否是整数
- * @Fcunction isNumeric
- * @param str
- * @return boolean
- *
- */
- public static boolean isNumeric(String str) {
- if(str.indexOf(".")>0) {
- return false;
- }
- return true;
- }
- /**
- *
- * @Date 2018年7月19日 上午11:44:48
- * @Description 正式计划草案获取前两行
- * @Fcunction getCzzscaList
- * @param jnjhzh
- * @param trimpro
- * @param temp
- * @return List<List<String>>
- *
- */
- public static List<List<String>> getCzzscaList(String jnjhzh,String trimpro,String temp) {
- List<List<String>> list = new ArrayList<List<String>>();
- List<String> l1 = new ArrayList<String>(); //固定第一行
- 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<String> l2 = new ArrayList<String>(); //固定第二行
- 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 < rows; i++) {
- XWPFTableRow rowsContent = ComTable.createRow();
- for (int j = 0; j < list.get(i).size(); j++) {
- rowsContent.getCell(j).setText(list.get(i).get(j)+""); //用单元格加载内容
- }
- }
(2)设置单元格内字体字号、是否加粗
- for (int i = 0; i < rows; i++) {
- XWPFTableRow rowsContent = ComTable.createRow();
- for (int j = 0; j < list.get(i).size(); j++) {
- XWPFParagraph cellParagraphC = rowsContent.getCell(j).getParagraphs().get(0);
- if(j!=1&&j!=7) {
- cellParagraphC.setAlignment(ParagraphAlignment.CENTER); //设置表格内容居中
- }
- XWPFRun cellParagraphRunC = cellParagraphC.createRun();
- cellParagraphRunC.setFontSize(10); //设置表格内容字号
- cellParagraphRun.setBold(true); //设置表头单元格加粗
- cellParagraphRunC.setText(list.get(i).get(j)+""); //单元格段落加载内容
- }
- }
4.单元格居中(水平居中、垂直居中)
(1)使用单元格加载内容
- for (int i = 0; i < value_columns.length; i++) {
- XWPFTableCell cell = ComTable.getRow(0).getCell(i);
- cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); //垂直居中
- CTTc cttc = cell.getCTTc();
- CTP ctp = cttc.getPList().get(0);
- CTPPr ctppr = ctp.getPPr();
- if (ctppr == null) {
- ctppr = ctp.addNewPPr();
- }
- CTJc ctjc = ctppr.getJc();
- if (ctjc == null) {
- ctjc = ctppr.addNewJc();
- }
- ctjc.setVal(STJc.CENTER); //水平居中
- }
(2)使用单元格的段落加载内容,只用调用垂直居中的方法
- for (int i = 0; i < value_columns.length; i++) {
- XWPFTableCell cell = ComTable.getRow(0).getCell(i);
- cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); //垂直居中
- }
水平居中在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);
- }
- }
- }
六、使用到的Maven依赖
- <dependency>
- <groupId>org.apache.xmlbeans</groupId>
- <artifactId>xmlbeans</artifactId>
- <version>2.6.0</version>
- </dependency>
- <dependency>
- <groupId>org.apache.poi</groupId>
- <artifactId>poi-ooxml</artifactId>
- <version>3.9</version>
- </dependency>
- <dependency>
- <groupId>org.apache.poi</groupId>
- <artifactId>ooxml-schemas</artifactId>
- <version>1.1</version>
- </dependency>
- <dependency>
- <groupId>org.apache.poi</groupId>
- <artifactId>poi-ooxml-schemas</artifactId>
- <version>3.16</version>
- </dependency>
poi导出word表格详解 超详细了的更多相关文章
- poi导出word表格跨行
DataCommon.java package com.ksource.pwlp.model.statistic; public class DataCommon { private Long id; ...
- Transform详解(超详细) Attention is all you need论文
一.背景 自从Attention机制在提出 之后,加入Attention的Seq2 Seq模型在各个任务上都有了提升,所以现在的seq2seq模型指的都是结合rnn和attention的模型.传统的基 ...
- JAVA反射概念及使用详解(超详细)
JAVA反射概念及使用详解 一.什么是反射? 反射:框架设计的灵魂 框架:半成品软件.可以在框架的基础上进行软件开发,简化编码 反射:将类的各个组成部分封装为其他对象,这就是反射机制 好处: ...
- poi导出word表格
代码如下: package com.ksource.pwlp.util; import java.io.FileOutputStream; import java.math.BigInteger; i ...
- Linux系统管理图文详解超详细精心整理
前言:带你遨游于linux系统管理知识的海洋,沐浴春日里的阳光,循序渐进,看完之后收获满满. 本次讲解基于linux(centos6.5)虚拟机做的测试,centos7估计以后有时间再更新啊. lin ...
- 【Linux】saltstack的使用详解 超详细
一.salt常用命令 salt 该命令执行salt的执行模块,通常在master端运行,也是我们最常用到的命令 salt [options] '<target>' <function ...
- http协议详解(超详细)
http1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web Consorti ...
- Nginx优化详解-------超详细
一.一般来说nginx 配置文件中对优化比较有作用的为以下几项: 1. worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cp ...
- 使用POI导出Word(含表格)的实现方式及操作Word的工具类
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
随机推荐
- redis使用Jackson2JsonRedisSerializer序列化问题
一.spring boot 集成Redis方法 依赖 <!--redis--> <dependency> <groupId>org.springframework. ...
- 浅谈jQuery构造函数
$()函数到底做的什么 jQuery在前端领域路人皆知,对于一向喜欢玩js的博主来说,虽然能力有限,但是还是很喜欢研究他的做为.那么一个简单的美元符号$与一对常见的()括号,jQuery底层到底做了哪 ...
- 王者荣耀交流协会final发布-第一次scrum立会
1.例会照片 成员王超,高远博,冉华,王磊,王玉玲,任思佳,袁玥全部到齐 master:袁玥 2.时间跨度 2017年12月1日 17:00 — 17:31,总计31分钟 3.地点 一食堂二楼沙发座椅 ...
- spring冲刺计划
会议召开时间表 日期 时间 内容 05/09 21:00-22:00 讨论题目(未果) 05/10 21:00-21:30 确定题目(网络助手) 05/13 21:00-21:45 讨论软件页面设计 ...
- 第一阶段Spring个人总结
通过这一阶段的冲刺,我感到的是名义上的团队,而实际上却是一个人的事,每个人跟每个人都不一样,都有自己的特点,总会出些不必要的麻烦. 还有团队的进展也是看不到什么东西,说实话,这次我并没有太多关注团队的 ...
- java 框架 面试
Java—SSH(MVC)1. 谈谈你mvc的理解MVC是Model—View—Controler的简称.即模型—视图—控制器.MVC是一种设计模式,它强制性的把应用程序的输入.处理和输出分开.MVC ...
- Firefox插件开发学习总结
2018.06.14 我们小组最初只准备开发运行在google上的知乎插件,但我们经过调研发现还有一大部分用户是使用的火狐浏览器,所以我们也准备制作火狐插件.以下是我学习了部分火狐插件制作知识后的总结 ...
- 个人作业2——APP案例分析
产品:网易LOFTER(乐乎) 网易LOFTER是网易旗下图片社交APP,产品覆盖web及移动各端. 网易LOFTER社区内汇聚了多领域的品质生活家与生活达人,包含女神.明星.穿搭.文具.旅行.美 ...
- 深入理解Java虚拟机 &GC分代年龄
堆内存 Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象.在 Java 中,堆被划分成两个不同的区域:新生代 ( Young ).老年代 ( Old ).新生代 ( ...
- Scrum 项目 3.0
-------------------------------------3.0----------------------------------------------------- 一.项目工作 ...