POI使用word模板檔案迴圈輸出行並匯出word
說明
最近工作被臨時安排了一個給同事們報銷的差事,要知道報銷這個事情對於一個開發人員是真的麻煩透頂,數目金額等等都要核對。。。。想我一個根正苗紅的正宗java開發工程師,是萬萬忍受不了讓我一個個的填寫資訊的,所以就有了這篇文章。
那就開始吧
在這裡我要吐槽一下,有些大神寫完放上原始碼就完了,jar包版本也不說明,碰到jar包向下相容的還好,有些jar包是完全大改,有的介面都不能用了!!所以還是希望寫完部落格的同時把背景交待清楚。。。
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sdut</groupId>
<artifactId>poiDemo</artifactId>
<version>1.0-SNAPSHOT</version >
<name>poiDemo</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source >
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-lang/commons-lang -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-scratchpad -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-schemas -->
<!--<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.17</version>
</dependency>-->
<!-- https://mvnrepository.com/artifact/org.apache.poi/ooxml-schemas -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
<version>1.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-excelant -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-excelant</artifactId>
<version>3.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-examples -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-examples</artifactId>
<version>3.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.xmlbeans/xmlbeans -->
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>2.6.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.virtuald/curvesapi -->
<dependency>
<groupId>com.github.virtuald</groupId>
<artifactId>curvesapi</artifactId>
<version>1.04</version>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
WordReporter.class
package com.sdut.PoiDemo;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
import java.io.*;
import java.util.List;
import java.util.Map;
/**
* Created by lzx on 2018/8/12
*/
public class WordReporter {
private String tempLocalPath;
private XWPFDocument xwpfDocument = null;
private FileInputStream inputStream = null;
private OutputStream outputStream = null;
public WordReporter(){
}
public WordReporter(String tempLocalPath){
this.tempLocalPath = tempLocalPath;
}
/**
* 設定模板路徑
* @param tempLocalPath
*/
public void setTempLocalPath(String tempLocalPath) {
this.tempLocalPath = tempLocalPath;
}
/**
* 初始化
* @throws IOException
*/
public void init() throws IOException{
inputStream = new FileInputStream(new File(this.tempLocalPath));
xwpfDocument = new XWPFDocument(inputStream);
}
/**
* 匯出方法
* @param params
* @param tableIndex
* @return
* @throws Exception
*/
public boolean export(List<Map<String,String>> params, int tableIndex) throws Exception{
this.insertValueToTable(xwpfDocument,params,tableIndex);
return true;
}
/**
* 迴圈填充表格內容
* @param xwpfDocument
* @param params
* @param tableIndex
* @throws Exception
*/
private void insertValueToTable(XWPFDocument xwpfDocument, List<Map<String,String>> params, int tableIndex) throws Exception {
List<XWPFTable> tableList = xwpfDocument.getTables();
if(tableList.size()<=tableIndex){
throw new Exception("tableIndex對應的表格不存在");
}
XWPFTable table = tableList.get(tableIndex);
List<XWPFTableRow> rows = table.getRows();
if(rows.size()<2){
throw new Exception("tableIndex對應表格應該為2行");
}
//模板的那一行
XWPFTableRow tmpRow = rows.get(1);
List<XWPFTableCell> tmpCells = null;
List<XWPFTableCell> cells = null;
XWPFTableCell tmpCell = null;
tmpCells = tmpRow.getTableCells();
String cellText = null;
String cellTextKey = null;
Map<String,Object> totalMap = null;
for (int i = 0, len = params.size(); i < len; i++) {
Map<String,String> map = params.get(i);
// 建立新的一行
XWPFTableRow row = table.createRow();
// 獲取模板的行高 設定為新一行的行高
row.setHeight(tmpRow.getHeight());
cells = row.getTableCells();
for (int k = 0, klen = cells.size(); k < klen; k++) {
tmpCell = tmpCells.get(k);
XWPFTableCell cell = cells.get(k);
cellText = tmpCell.getText();
if (StringUtils.isNotBlank(cellText)) {
//轉換為mapkey對應的欄位
cellTextKey = cellText.replace("$", "").replace("{", "").replace("}", "");
if (map.containsKey(cellTextKey)) {
// 填充內容 並且複製模板行的屬性
setCellText(tmpCell,cell,map.get(cellTextKey));
}
}
}
}
// 刪除模版行
table.removeRow(1);
}
/**
* 複製模板行的屬性
* @param tmpCell
* @param cell
* @param text
* @throws Exception
*/
private void setCellText(XWPFTableCell tmpCell, XWPFTableCell cell,String text) throws Exception {
CTTc cttc2 = tmpCell.getCTTc();
CTTcPr ctPr2 = cttc2.getTcPr();
CTTc cttc = cell.getCTTc();
CTTcPr ctPr = cttc.addNewTcPr();
if (ctPr2.getTcW() != null) {
ctPr.addNewTcW().setW(ctPr2.getTcW().getW());
}
if (ctPr2.getVAlign() != null) {
ctPr.addNewVAlign().setVal(ctPr2.getVAlign().getVal());
}
if (cttc2.getPList().size() > 0) {
CTP ctp = cttc2.getPList().get(0);
if (ctp.getPPr() != null) {
if (ctp.getPPr().getJc() != null) {
cttc.getPList().get(0).addNewPPr().addNewJc()
.setVal(ctp.getPPr().getJc().getVal());
}
}
}
if (ctPr2.getTcBorders() != null) {
ctPr.setTcBorders(ctPr2.getTcBorders());
}
XWPFParagraph tmpP = tmpCell.getParagraphs().get(0);
XWPFParagraph cellP = cell.getParagraphs().get(0);
XWPFRun tmpR = null;
if (tmpP.getRuns() != null && tmpP.getRuns().size() > 0) {
tmpR = tmpP.getRuns().get(0);
}
XWPFRun cellR = cellP.createRun();
cellR.setText(text);
// 複製字型資訊
if (tmpR != null) {
if(!cellR.isBold()){
cellR.setBold(tmpR.isBold());
}
cellR.setItalic(tmpR.isItalic());
cellR.setUnderline(tmpR.getUnderline());
cellR.setColor(tmpR.getColor());
cellR.setTextPosition(tmpR.getTextPosition());
if (tmpR.getFontSize() != -1) {
cellR.setFontSize(tmpR.getFontSize());
}
if (tmpR.getFontFamily() != null) {
cellR.setFontFamily(tmpR.getFontFamily());
}
if (tmpR.getCTR() != null) {
if (tmpR.getCTR().isSetRPr()) {
CTRPr tmpRPr = tmpR.getCTR().getRPr();
if (tmpRPr.isSetRFonts()) {
CTFonts tmpFonts = tmpRPr.getRFonts();
CTRPr cellRPr = cellR.getCTR().isSetRPr() ? cellR
.getCTR().getRPr() : cellR.getCTR().addNewRPr();
CTFonts cellFonts = cellRPr.isSetRFonts() ? cellRPr
.getRFonts() : cellRPr.addNewRFonts();
cellFonts.setAscii(tmpFonts.getAscii());
cellFonts.setAsciiTheme(tmpFonts.getAsciiTheme());
cellFonts.setCs(tmpFonts.getCs());
cellFonts.setCstheme(tmpFonts.getCstheme());
cellFonts.setEastAsia(tmpFonts.getEastAsia());
cellFonts.setEastAsiaTheme(tmpFonts.getEastAsiaTheme());
cellFonts.setHAnsi(tmpFonts.getHAnsi());
cellFonts.setHAnsiTheme(tmpFonts.getHAnsiTheme());
}
}
}
}
// 複製段落資訊
cellP.setAlignment(tmpP.getAlignment());
cellP.setVerticalAlignment(tmpP.getVerticalAlignment());
cellP.setBorderBetween(tmpP.getBorderBetween());
cellP.setBorderBottom(tmpP.getBorderBottom());
cellP.setBorderLeft(tmpP.getBorderLeft());
cellP.setBorderRight(tmpP.getBorderRight());
cellP.setBorderTop(tmpP.getBorderTop());
cellP.setPageBreak(tmpP.isPageBreak());
if (tmpP.getCTP() != null) {
if (tmpP.getCTP().getPPr() != null) {
CTPPr tmpPPr = tmpP.getCTP().getPPr();
CTPPr cellPPr = cellP.getCTP().getPPr() != null ? cellP
.getCTP().getPPr() : cellP.getCTP().addNewPPr();
// 複製段落間距資訊
CTSpacing tmpSpacing = tmpPPr.getSpacing();
if (tmpSpacing != null) {
CTSpacing cellSpacing = cellPPr.getSpacing() != null ? cellPPr
.getSpacing() : cellPPr.addNewSpacing();
if (tmpSpacing.getAfter() != null) {
cellSpacing.setAfter(tmpSpacing.getAfter());
}
if (tmpSpacing.getAfterAutospacing() != null) {
cellSpacing.setAfterAutospacing(tmpSpacing
.getAfterAutospacing());
}
if (tmpSpacing.getAfterLines() != null) {
cellSpacing.setAfterLines(tmpSpacing.getAfterLines());
}
if (tmpSpacing.getBefore() != null) {
cellSpacing.setBefore(tmpSpacing.getBefore());
}
if (tmpSpacing.getBeforeAutospacing() != null) {
cellSpacing.setBeforeAutospacing(tmpSpacing
.getBeforeAutospacing());
}
if (tmpSpacing.getBeforeLines() != null) {
cellSpacing.setBeforeLines(tmpSpacing.getBeforeLines());
}
if (tmpSpacing.getLine() != null) {
cellSpacing.setLine(tmpSpacing.getLine());
}
if (tmpSpacing.getLineRule() != null) {
cellSpacing.setLineRule(tmpSpacing.getLineRule());
}
}
// 複製段落縮排資訊
CTInd tmpInd = tmpPPr.getInd();
if (tmpInd != null) {
CTInd cellInd = cellPPr.getInd() != null ? cellPPr.getInd()
: cellPPr.addNewInd();
if (tmpInd.getFirstLine() != null) {
cellInd.setFirstLine(tmpInd.getFirstLine());
}
if (tmpInd.getFirstLineChars() != null) {
cellInd.setFirstLineChars(tmpInd.getFirstLineChars());
}
if (tmpInd.getHanging() != null) {
cellInd.setHanging(tmpInd.getHanging());
}
if (tmpInd.getHangingChars() != null) {
cellInd.setHangingChars(tmpInd.getHangingChars());
}
if (tmpInd.getLeft() != null) {
cellInd.setLeft(tmpInd.getLeft());
}
if (tmpInd.getLeftChars() != null) {
cellInd.setLeftChars(tmpInd.getLeftChars());
}
if (tmpInd.getRight() != null) {
cellInd.setRight(tmpInd.getRight());
}
if (tmpInd.getRightChars() != null) {
cellInd.setRightChars(tmpInd.getRightChars());
}
}
}
}
}
/**
* 收尾方法
* @param outDocPath
* @return
* @throws IOException
*/
public boolean generate(String outDocPath) throws IOException{
outputStream = new FileOutputStream(outDocPath);
xwpfDocument.write(outputStream);
this.close(outputStream);
this.close(inputStream);
return true;
}
/**
* 關閉輸入流
* @param is
*/
private void close(InputStream is) {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 關閉輸出流
* @param os
*/
private void close(OutputStream os) {
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
WordExportDemo.class
package com.sdut.PoiDemo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by lzx on 2018/8/12
*/
public class WordExportDemo {
public static void main(String[] args) throws Exception {
// 新增假資料 這裡你也可以從資料庫裡獲取資料
List<Map<String, String>> list = new ArrayList<>();
for (int i =0;i < 30; i++){
Map<String,String> map = new HashMap<>();
map.put("time", "2018"+i);
map.put("begin", "我在這"+i);
map.put("end", "你好"+i);
map.put("content", "加班啊"+i);
map.put("money", "123");
list.add(map);
}
// 模板檔案輸入輸出地址
String filePath = "E:/workspace/poiDemo/src/main/java/config/demo.docx";
String outPath = "E:/workspace/poiDemo/src/main/java/config/demo1.docx";
WordReporter wordReporter = new WordReporter();
wordReporter.setTempLocalPath(filePath);
wordReporter.init();
wordReporter.export(list,0);
wordReporter.generate(outPath);
}
}
模板檔案地址
截圖展示
相關推薦
POI使用word模板檔案迴圈輸出行並匯出word
說明 最近工作被臨時安排了一個給同事們報銷的差事,要知道報銷這個事情對於一個開發人員是真的麻煩透頂,數目金額等等都要核對。。。。想我一個根正苗紅的正宗java開發工程師,是萬萬忍受不了讓我一個個的填寫資訊的,所以就有了這篇文章。 那就開始吧 在這裡我要吐槽
Java讀取並匯出Word中的表格(Excel),匯出檔案為Excel
看公司的同事很費勁的在一條一條地從Word中的表格複製貼上到Excel, 我從網上找個兩個demo給合在了一起,幫他解決了問題。最下方有原始碼。 一個兩個類 第一個: package com.wbs.test; import java.io.FileInputStream
Python檔案迴圈寫入行時防止覆蓋
存在問題: 利用寫入程式碼 with open(r'F:\PythonFiles\PycharmFile\ssq.csv', 'w', encoding='utf-8-sig', newline='') as csvFile: csv.w
Thinkphp5模板中迴圈輸出
{volistname='res' id='admin'} <trclass="text-c"> <td><inputtype="checkbox" value="1" name=""></td> <td>{$ad
基於ABP做一個簡單的系統——實戰篇:4.基於富文字編輯器,Razor模板引擎生成內容並匯出Word 填坑記錄
起因 需求是這樣的,有一種協議需要生成,協議的模板是可配置的,在生成過程中,模板中的內容可以根據約定的標記進行替換(就像mvc的razor模板一樣)。生成後的內容還需要匯出成word或pdf。 常見的使用場景比如租賃協議生成,郵件內容模板生成等等,不要傻傻的hard-code像‘#name#’這樣的標記了。
實現截圖頁面並匯出word
1.說明 截圖是現在手機應用的最基本的功能,大夥兒都喜歡將自己的手機上的某個畫面截圖發到朋友圈上。當是在實現的開發時,非APP的應用,我們也需要截圖某個頁面,將其做成報告或存檔。這時筆者將分別介紹使用java的jsp的技術應該如何實現。 2.技術實現 2.1Java技術
SSIS 根據查詢庫中的年月按月迴圈輸出CSV檔案並動態以該月份命名
SSIS 根據查詢庫中的年月按月迴圈輸出CSV檔案並以該月份命名。 先看一下整體結構。 控制流: 資料流: 首先我們先做一個執行sql任務,配置如下: 結果集配置: 注意結果集中的變數是Object型別的,因為返回的是結果集型別。要是單個數據則該變數為Str
查詢檔案中包含某個字串的行並將所有滿足條件行輸出到新檔案使用命令
查詢檔案中包含某個字串的行並將所有滿足條件行輸出使用命令 dos命令 find "關鍵字" 原始檔 > 輸出檔案 例如 find "QD00001" activity.task.log > activity.task1.txt linux命令 cat
java根據模板生成pdf檔案並匯出(轉)
import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.IOException; import com.itextpdf.text.Document; import com.itextpdf.
用python比較兩個文件中內容的不同之處, 並輸出行號和內容.
exist file diff pre ffline += == list cmp 代碼部分: ‘‘‘cmpfile.py - 比對兩個文件, 如果有不同之處, 打印內容和行號‘‘‘ import os class cmpFile: def __init__(
4.用while和for迴圈輸出1到100之間能被5整除的數,且每行輸出3個。
用while和for迴圈輸出1到100之間能被5整除的數,且每行輸出3個。 /** * [說明]:用while和for迴圈輸出1到100之間能被5整除的數,且每行輸出3個。 * @author aeon */ public class TestWhileFor { public stat
檔案輸入輸出【模板】
檔案輸入輸出【模板】 直接看程式碼 #include <cstdio> int main() { freopen("*.in","r",stdin); freopen("*.out","w",stdout); /*---code---*/ /*---end-
Java生成並匯出Json檔案
將一個list集合轉換成json檔案並匯出: 資料集合: List<Object> agencyList = new ArrayList<Object>(); Map<String, Object> agencyMap
C#:讀取html模板檔案,並替換修改檔案中指定值,儲存為修改後的檔案
1.準備html模板檔案:Pages/Device/DeviceModel8.html 2 using System.IO:讀取檔案內容,並替換指定內容 &nbs
C#使用NPOI讀取excel模板,並匯出excel
private void ExportDoctoryCase(HttpContext context) { //載入模板檔案路徑 string TempletFileName = context.Serv
JAVA-將內容寫入檔案並匯出到壓縮包
取出資料庫表中的內容寫入到檔案,並將所有檔案寫入到壓縮包最終匯出到指定的某目錄下 //匯出的壓縮包格式 xxxx_date Dat
grib中資料讀取並匯出到文字檔案中
最近忙著趕專案加上家裡的事比較多,就沒有來得及更新部落格,今天主要講解一下grib資料的檢視方法和讀取方法。grib資料沒有找到好的視覺化工具開啟它,官網提供的一個視覺化工具叫Metview,此工具的安裝過程相當的複雜,搞了將近3個小時最後還是沒有安裝成功,由於
Java-web利用模板檔案實現匯出自定義word文件
由於專案開發需要,產品給出word模板,需要匯出該格式的word檔案。 1.通過word模板檔案生成我們需要的模板.ftl檔案。 步驟:將word檔案轉換成Microsoft XML格式檔案(開啟word,檔案另存為xml格式檔案),用notepad++編輯器開啟檔案,修
C語言建立迴圈單鏈表並輸出
Description 依次輸入n(n>0)個整數,建立帶表頭結點的迴圈單鏈表,並依次輸出單鏈表中的元素值。 提示: 結點結構如下: typedef struct Node { int data; &
Awk讀取檔案第5行到第十行內容輸出其中包含a關鍵字的行號以及內容
awk 'NR>=5&&NR<=10&&match($0,'a'){print NR,$0}' awk命令形式: awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END