――Es fasst die Inhalte zusammen, die durch Ausprobieren funktioniert haben --Excel-Dateien sind für das XLSX-Format vorgesehen
――Es kann nicht unterstützt werden, wenn jedes Zeichen in einer Zeichenfolge anders formatiert ist.
Ich habe den Code auch auf Github gesetzt.
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) {
//Überprüfen und Abrufen von Befehlszeilenargumenten
if (args.length < 4) {
System.exit(1);
}
//Zu ersetzende Zeichenfolge
String textTarget = args[0];
//Zeichenkette nach dem Ersetzen
String textReplacement = args[1];
//Ersetzt werden.xlsx-Datei
String filenameSrc = args[2];
//Erstellt nach dem Austausch.xlsx-Datei
String filenameDest = args[3];
try {
//Kopieren Sie die Ausgabezieldatei und schreiben Sie sie neu
Files.copy(Paths.get(filenameSrc), Paths.get(filenameDest), StandardCopyOption.REPLACE_EXISTING);
OPCPackage pkg = OPCPackage.open(new FileInputStream(filenameDest));
XSSFWorkbook workBook = new XSSFWorkbook(pkg);
//Prozess pro Blatt
int n = workBook.getNumberOfSheets();
for (int i = 0; i < n; i++) {
XSSFSheet sheet = workBook.getSheetAt(i);
XSSFDrawing drawing = sheet.createDrawingPatriarch();
//Prozess durch automatische Formgebung
for (XSSFShape shape : drawing.getShapes()) {
if (!(shape instanceof XSSFSimpleShape)) {
//Nicht kompatibel mit gruppierten automatischen Formen
continue;
}
//Griff für nicht gruppierte Autoshapes
XSSFSimpleShape simpleShape = (XSSFSimpleShape)shape;
CTTextBody textBody = simpleShape.getCTShape().getTxBody();
if (null == textBody) {
continue;
}
for (XSSFTextParagraph textParagraph : simpleShape.getTextParagraphs()) {
for (XSSFTextRun textRun : textParagraph.getTextRuns()) {
//Ersetzen Sie den Text der formatierten Einheit
//Daher wird es nicht unterstützt, wenn die Formateinstellung für jedes Zeichen unterschiedlich ist.
textRun.setText(textRun.getText().replace(textTarget, textReplacement));
}
}
}
}
FileOutputStream fileOut = new FileOutputStream(filenameDest);
workBook.write(fileOut);
fileOut.close();
workBook.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Verwenden Sie beim Erstellen mit Gradle build.gradle wie unten gezeigt.
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)
}
}
Führen Sie dann mit gradlew Folgendes aus.
./gradlew run -PappArgs="['Vor dem Austausch','Nach dem Austausch','input.xlsx','output.xlsx']"
Recommended Posts