――Il résume le contenu qui a fonctionné par essais et erreurs
――Il ne peut pas être pris en charge si chaque caractère est formaté différemment dans une chaîne de caractères.
J'ai également mis le code sur Github.
https://github.com/sadapon2008/autoshape-text-replace
src/main/java/sadapon2008/Application.java
package sadapon2008;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFShape;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFSimpleShape;
import org.apache.poi.xssf.usermodel.XSSFTextParagraph;
import org.apache.poi.xssf.usermodel.XSSFTextRun;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
public class Application {
public static void main(String[] args) {
//Vérification et obtention des arguments de ligne de commande
if (args.length < 4) {
System.exit(1);
}
//Chaîne de caractères à remplacer
String textTarget = args[0];
//Chaîne de caractères après remplacement
String textReplacement = args[1];
//Être remplacé.fichier xlsx
String filenameSrc = args[2];
//Créé après remplacement.fichier xlsx
String filenameDest = args[3];
try {
//Copiez le fichier de destination de sortie, puis réécrivez-le
Files.copy(Paths.get(filenameSrc), Paths.get(filenameDest), StandardCopyOption.REPLACE_EXISTING);
OPCPackage pkg = OPCPackage.open(new FileInputStream(filenameDest));
XSSFWorkbook workBook = new XSSFWorkbook(pkg);
//Processus par feuille
int n = workBook.getNumberOfSheets();
for (int i = 0; i < n; i++) {
XSSFSheet sheet = workBook.getSheetAt(i);
XSSFDrawing drawing = sheet.createDrawingPatriarch();
//Processus par forme automatique
for (XSSFShape shape : drawing.getShapes()) {
if (!(shape instanceof XSSFSimpleShape)) {
//Non compatible avec les formes automatiques groupées
continue;
}
//Poignée pour les formes automatiques non groupées
XSSFSimpleShape simpleShape = (XSSFSimpleShape)shape;
CTTextBody textBody = simpleShape.getCTShape().getTxBody();
if (null == textBody) {
continue;
}
for (XSSFTextParagraph textParagraph : simpleShape.getTextParagraphs()) {
for (XSSFTextRun textRun : textParagraph.getTextRuns()) {
//Remplacez le texte de l'unité formatée
//Par conséquent, il n'est pas pris en charge lorsque le paramètre de format est différent pour chaque caractère.
textRun.setText(textRun.getText().replace(textTarget, textReplacement));
}
}
}
}
FileOutputStream fileOut = new FileOutputStream(filenameDest);
workBook.write(fileOut);
fileOut.close();
workBook.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Lors de la construction avec gradle, utilisez build.gradle comme indiqué ci-dessous.
build.gradle
apply plugin: 'java'
apply plugin:'application'
sourceCompatibility = '1.8'
targetCompatibility = '1.8'
mainClassName = 'sadapon2008.Application'
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
repositories {
mavenCentral()
}
dependencies {
compile group: 'org.apache.poi', name: 'poi', version: '3.15'
compile group: 'org.apache.poi', name: 'poi-ooxml', version: '3.15'
testCompile 'junit:junit:4.12'
}
run {
if (project.hasProperty("appArgs")) {
args Eval.me(appArgs)
}
}
Puis exécutez ce qui suit avec gradlew.
./gradlew run -PappArgs="['Avant le remplacement','Après remplacement','input.xlsx','output.xlsx']"
Recommended Posts