Java使用poi操作resource下的word文件
1、导入poi
< dependency>
< groupId> org.apache.poi</ groupId>
< artifactId> poi</ artifactId>
< version> 4.1.0</ version>
</ dependency>
< dependency>
< groupId> org.apache.poi</ groupId>
< artifactId> poi-ooxml</ artifactId>
< version> 4.1.0</ version>
</ dependency>
2、poi操作word工具类
import lombok. extern. slf4j. Slf4j ;
import org. apache. commons. collections4. MapUtils ;
import org. apache. commons. lang3. StringUtils ;
import org. apache. poi. xwpf. usermodel. * ;
import org. openxmlformats. schemas. wordprocessingml. x2006. main. * ;
import java. util. Iterator ;
import java. util. List ;
import java. util. Map ;
import java. util. regex. Matcher ;
import java. util. regex. Pattern ;
@Slf4j
public class PoiWordUtils {
public static XWPFTable getTable ( XWPFDocument doc, int tableIndex) {
return doc. getTables ( ) . get ( tableIndex) ;
}
public static void insertTable ( XWPFTable table, List < String [ ] > tableList, int index, int cellNum) {
for ( int i = 0 ; i < tableList. size ( ) ; i++ ) {
XWPFTableRow targetRow = table. insertNewTableRow ( index + i) ;
for ( int j = 0 ; j < cellNum; j++ ) {
XWPFTableCell newCell = targetRow. addNewTableCell ( ) ;
newCell. setVerticalAlignment ( XWPFTableCell. XWPFVertAlign . CENTER) ;
CTTc cttc = newCell. 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) ;
newCell. removeParagraph ( 0 ) ;
List < XWPFParagraph > targetParagraphs = newCell. getParagraphs ( ) ;
XWPFParagraph ph = StringUtils . isEmpty ( newCell. getText ( ) ) ? newCell. addParagraph ( ) : targetParagraphs. get ( 0 ) ;
ph. removeRun ( 0 ) ;
ph. setAlignment ( ParagraphAlignment . CENTER) ;
XWPFRun run = ph. getRuns ( ) . isEmpty ( ) ? ph. createRun ( ) : ph. getRuns ( ) . get ( 0 ) ;
run. setFontFamily ( "方正仿宋简体" ) ;
run. setFontSize ( 10 ) ;
run. setText ( tableList. get ( i) [ j] ) ;
}
}
}
public static void updateTable ( XWPFTable table, String [ ] cellDatas, int index, int cellNum, int startCell) {
XWPFTableRow row = table. getRow ( index) ;
for ( int i = startCell; i < cellNum; i++ ) {
XWPFTableCell cell = row. 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) ;
List < XWPFParagraph > targetParagraphs = cell. getParagraphs ( ) ;
XWPFParagraph ph = targetParagraphs. get ( 0 ) ;
ph. setAlignment ( ParagraphAlignment . CENTER) ;
XWPFRun run = ph. getRuns ( ) . isEmpty ( ) ? ph. createRun ( ) : ph. getRuns ( ) . get ( 0 ) ;
run. setFontFamily ( "方正仿宋简体" ) ;
run. setFontSize ( 10 ) ;
run. setText ( cellDatas[ i - startCell] ) ;
}
}
public static void replaceParams ( XWPFDocument doc, Map < String , Object > params) {
Iterator < XWPFParagraph > iterator = doc. getParagraphsIterator ( ) ;
XWPFParagraph paragraph;
while ( iterator. hasNext ( ) ) {
paragraph = iterator. next ( ) ;
replaceParam ( paragraph, params) ;
}
}
public static void insertParagraph ( XWPFDocument doc, List < String [ ] > datas, String flag) {
Iterator < XWPFParagraph > iterator = doc. getParagraphsIterator ( ) ;
XWPFParagraph ph;
while ( iterator. hasNext ( ) ) {
ph = iterator. next ( ) ;
String paragraphText = ph. getParagraphText ( ) ;
if ( StringUtils . equals ( paragraphText, flag) ) {
ph. removeRun ( 0 ) ;
for ( int i = 0 ; i < datas. size ( ) ; i++ ) {
for ( int j = 0 ; j < datas. get ( i) . length; j++ ) {
XWPFRun run = ph. insertNewRun ( j) ;
run. setFontFamily ( "方正仿宋简体" ) ;
run. setFontSize ( 10 ) ;
run. addTab ( ) ;
run. setText ( datas. get ( i) [ j] ) ;
if ( j < datas. get ( i) . length - 1 ) {
run. addBreak ( BreakClear . ALL) ;
}
}
}
}
}
}
public static void replaceAllTableParams ( XWPFDocument doc, Map < String , Object > testMap) {
Iterator < XWPFTable > iterator = doc. getTablesIterator ( ) ;
XWPFTable table;
List < XWPFTableRow > rows;
List < XWPFTableCell > cells;
List < XWPFParagraph > paras;
while ( iterator. hasNext ( ) ) {
table = iterator. next ( ) ;
if ( matcher ( table. getText ( ) ) . find ( ) ) {
rows = table. getRows ( ) ;
for ( XWPFTableRow row : rows) {
cells = row. getTableCells ( ) ;
for ( XWPFTableCell cell : cells) {
paras = cell. getParagraphs ( ) ;
for ( XWPFParagraph para : paras) {
replaceParam ( para, testMap) ;
}
}
}
}
}
}
public static void replaceTableParams ( XWPFTable table, Map < String , Object > testMap) {
List < XWPFTableRow > rows;
List < XWPFTableCell > cells;
List < XWPFParagraph > paras;
if ( matcher ( table. getText ( ) ) . find ( ) ) {
rows = table. getRows ( ) ;
for ( XWPFTableRow row : rows) {
cells = row. getTableCells ( ) ;
for ( XWPFTableCell cell : cells) {
paras = cell. getParagraphs ( ) ;
for ( XWPFParagraph para : paras) {
replaceParam ( para, testMap) ;
}
}
}
}
}
public static Pattern pattern = Pattern . compile ( "\\$\\{(.+?)\\}" , Pattern . CASE_INSENSITIVE) ;
public static Matcher matcher ( String str) {
return pattern. matcher ( str) ;
}
public static void replaceParam ( XWPFParagraph paragraph, Map < String , Object > params) {
List < XWPFRun > runs;
Matcher matcher;
StringBuilder runText = new StringBuilder ( ) ;
if ( matcher ( paragraph. getParagraphText ( ) ) . find ( ) ) {
runs = paragraph. getRuns ( ) ;
int j = runs. size ( ) ;
for ( int i = 0 ; i < j; i++ ) {
runText. append ( runs. get ( 0 ) . toString ( ) ) ;
if ( ! ( ( j - 1 ) == i) ) {
paragraph. removeRun ( 0 ) ;
}
}
matcher = matcher ( runText. toString ( ) ) ;
if ( matcher. find ( ) ) {
while ( ( matcher = matcher ( runText. toString ( ) ) ) . find ( ) ) {
runText = new StringBuilder ( matcher. replaceFirst ( MapUtils . getString ( params, matcher. group ( 1 ) ) ) ) ;
}
runs. get ( 0 ) . setText ( runText. toString ( ) , 0 ) ;
}
}
}
public static void mergeCellsHorizontal ( XWPFTable table, int row, int startCell, int endCell) {
for ( int i = startCell; i <= endCell; i++ ) {
XWPFTableCell cell = table. getRow ( row) . getCell ( i) ;
if ( i == startCell) {
cell. getCTTc ( ) . addNewTcPr ( ) . addNewHMerge ( ) . setVal ( STMerge . RESTART) ;
} else {
cell. getCTTc ( ) . addNewTcPr ( ) . addNewHMerge ( ) . setVal ( STMerge . CONTINUE) ;
}
}
}
public static void mergeCellsVertically ( XWPFTable table, int col, int startRow, int endRow) {
for ( int i = startRow; i <= endRow; i++ ) {
XWPFTableCell cell = table. getRow ( i) . getCell ( col) ;
if ( i == startRow) {
cell. getCTTc ( ) . addNewTcPr ( ) . addNewVMerge ( ) . setVal ( STMerge . RESTART) ;
} else {
cell. getCTTc ( ) . addNewTcPr ( ) . addNewVMerge ( ) . setVal ( STMerge . CONTINUE) ;
}
}
}
}
3、在resource目录下新建word(后缀为docx)
4、读取test.docx文件
InputStream is = this . getClass ( ) . getClassLoader ( ) . getResourceAsStream ( "word/test.docx" ) ;
XWPFDocument doc = new XWPFDocument ( is) ;
List < POIXMLDocumentPart > relations = doc. getRelations ( ) ;
relations. forEach ( ( t) -> {
System . out. println ( t. toString ( ) ) ;
} ) ;
5、解决No valid entries or contents found, this is not a valid OOXML (Office Open XML) file报错
< plugins>
< plugin>
< groupId> org.apache.maven.plugins</ groupId>
< artifactId> maven-resources-plugin</ artifactId>
< configuration>
< nonFilteredFileExtensions>
< nonFilteredFileExtension> docx</ nonFilteredFileExtension>
</ nonFilteredFileExtensions>
</ configuration>
</ plugin>
</ plugins>