你好:
我在word中有想要移除由範本中某一個checkbox,但不成功,運作方式是根據DB紀錄生成表格,然後再經由游標到達bookmark處移除checkbox。但是總是顯示 java.lang.NullPointerException,程式碼和word範本如附件,再麻煩協助,謝謝!checkboxRemove.7z (24.8 KB)
不幸的是,我们无法执行您的代码,因为您通过 queryFromPool 从数据库获取日期。
请创建一个简单的 Java 应用程序(没有编译错误的源代码),以帮助我们在我们端重现您的问题并将其附在此处进行测试。
然后,我们将调查该问题并为您提供更多相关信息。
@tahir.manzoor
已調整需求,目前是想經由範本產生含有checkbox的檔案(經由程式判別Y或N),但是當範本產生之後,檔案內容卻是StructuredDocumentTag的字樣,這部分是需要如何調整的呢?
我们已经删除了 SQL Server 代码并通过代码设置数据,并且使用最新版本的 Aspose.Words for Java 21.9 没有发现共享问题。 所以,请使用 Aspose.Words for Java 21.9。
Document doc = new Document(MyDir + "Q-4-19-temp-1.docx");
DocumentBuilder builder = new DocumentBuilder(doc);
doc.getMailMerge().execute(new String[] {
"deviceName",
"deviceLocation",
}, new Object[] {
"Test", "Test2"
});
//表身
DataTable Q419 = new DataTable("Q-4-19");
Q419.getColumns().add("Dates");
Q419.getColumns().add("Fridge");
Q419.getColumns().add("Freezer");
Q419.getColumns().add("Checker");
Q419.getColumns().add("Rechecker");
Q419.getColumns().add("Audit");
for (int i = 0; i < 10; i++) {
DataRow row = Q419.newRow();
row.set(0, "111");
if (true) {
String bookmarkNameContact = "FridgeY";
// Find the contacts bookmark
com.aspose.words.Bookmark bookmarkContact = doc.getRange().getBookmarks().get(bookmarkNameContact);
System.out.println("bk:" + bookmarkContact);
String name = bookmarkContact.getName();
System.out.println("bk:" + name);
//row.set(1,"S");
StructuredDocumentTag checkBox = new StructuredDocumentTag(builder.getDocument(), SdtType.CHECKBOX, MarkupLevel.BLOCK);
StructuredDocumentTag checkBox2 = new StructuredDocumentTag(builder.getDocument(), SdtType.CHECKBOX, MarkupLevel.BLOCK);
checkBox.setChecked(true);
checkBox2.setChecked(false);
//builder.insertNode(checkBox);
row.set(1, "YY");
} else if (false) {
//builder.write("否\t");
row.set(1, "K");
}
row.set(2, "2");
row.set(3, "2");
row.set(4, "2");
row.set(5, "2");
Q419.getRows().add(row);
}
doc.getMailMerge().executeWithRegions(Q419);
doc.save(MyDir + "output.docx");
@tahir.manzoor
非常謝謝您的回覆,但若是於row.set()方法裡面如何加入checkbox呢?
我嘗試了一下都會出現像是附件中的情況。Q-4-19 (21).docx (15.6 KB)
请将光标移动到表格单元格内的书签并插入内容控件(复选框)。 请检查以下代码示例。
Document doc = new Document(MyDir + "input.docx");
DocumentBuilder builder = new DocumentBuilder(doc);
builder.moveToBookmark("Freezer");
StructuredDocumentTag checkBox = new StructuredDocumentTag(builder.getDocument(), SdtType.CHECKBOX, MarkupLevel.INLINE);
StructuredDocumentTag checkBox2 = new StructuredDocumentTag(builder.getDocument(), SdtType.CHECKBOX, MarkupLevel.INLINE);
checkBox.setChecked(true);
checkBox2.setChecked(false);
builder.insertNode(checkBox);
builder.insertNode(checkBox2);
doc.save(MyDir + "output.docx");
请实现 IFieldMergingCallback 接口,如下所示,以插入所需邮件合并字段的复选框。
我们建议您阅读以下文章。
Document doc = new Document(MyDir + "Q-4-19-temp-1.docx");
doc.getMailMerge().execute(new String[] {
"deviceName",
"deviceLocation",
}, new Object[] {
"Test", "Test2"
});
//表身
DataTable Q419 = new DataTable("Q-4-19");
Q419.getColumns().add("Dates");
Q419.getColumns().add("Fridge");
Q419.getColumns().add("Freezer");
Q419.getColumns().add("Checker");
Q419.getColumns().add("Rechecker");
Q419.getColumns().add("Audit");
for (int i = 0; i < 10; i++) {
DataRow row = Q419.newRow();
row.set(0, "111");
row.set(3, "2");
row.set(4, "2");
row.set(5, "2");
Q419.getRows().add(row);
}
doc.getMailMerge().setFieldMergingCallback(new IFieldMergingCallback() {
public void fieldMerging(FieldMergingArgs e) throws Exception {
if (mBuilder == null)
mBuilder = new DocumentBuilder(e.getDocument());
if ("Fridge".equals(e.getFieldName())) {
Row row = (Row)e.getField().getStart().getAncestor(NodeType.ROW);
if(row != null)
{
mBuilder.moveToMergeField("Fridge");
StructuredDocumentTag checkBox = new StructuredDocumentTag(mBuilder.getDocument(), SdtType.CHECKBOX, MarkupLevel.INLINE);
StructuredDocumentTag checkBox2 = new StructuredDocumentTag(mBuilder.getDocument(), SdtType.CHECKBOX, MarkupLevel.INLINE);
checkBox.setChecked(true);
mBuilder.insertNode(checkBox);
mBuilder.insertNode(checkBox2);
}
}
}
public void imageFieldMerging(ImageFieldMergingArgs args) throws Exception {
// Do nothing.
}
private DocumentBuilder mBuilder;
});
doc.getMailMerge().executeWithRegions(Q419);
doc.save(MyDir + "output.docx");
@tahir.manzoorQ-4-19 (2).docx (16.6 KB)
您好,謝謝您提供的sample code,所產出的款式如附件,想藉由DB端查出的資料,藉由程式邏輯設定checkbox的勾選狀態,確無法產生作用,要如何修正呢?
doc.getMailMerge().execute(new String[] {
“deviceName”,
“deviceLocation”,
}, new Object[] {
“Test”, “Test2”
});
//表身
DataTable Q419 = new DataTable(“Q-4-19”);
Q419.getColumns().add(“Dates”);
Q419.getColumns().add(“Fridge”);
Q419.getColumns().add(“Freezer”);
Q419.getColumns().add(“Checker”);
Q419.getColumns().add(“Rechecker”);
Q419.getColumns().add(“Audit”);
for (int i = 0; i < 10; i++) {
DataRow row = Q419.newRow();
row.set(0, “111”);
row.set(3, “2”);
row.set(4, “2”);
row.set(5, “2”);
Q419.getRows().add(row);
}
doc.getMailMerge().setFieldMergingCallback(new IFieldMergingCallback() {
public void fieldMerging(FieldMergingArgs e) throws Exception {
if (mBuilder == null)
mBuilder = new DocumentBuilder(e.getDocument());
if ("Fridge".equals(e.getFieldName())) {
Row row = (Row)e.getField().getStart().getAncestor(NodeType.ROW);
if(row != null)
{
mBuilder.moveToMergeField("Fridge");
StructuredDocumentTag checkBox = new StructuredDocumentTag(mBuilder.getDocument(), SdtType.CHECKBOX, MarkupLevel.INLINE);
StructuredDocumentTag checkBox2 = new StructuredDocumentTag(mBuilder.getDocument(), SdtType.CHECKBOX, MarkupLevel.INLINE);
String sql="SELECT Dates,Fridge,Freezer,Checker,Rechecker,Audit FROM Q_4_19
if(Fridge.equals("true")){
checkBox.setChecked(true);
checkBox2.setChecked(false);
}else{
checkBox.setChecked(false);
checkBox2.setChecked(true);
}
mBuilder.insertNode(checkBox);
mBuilder.insertNode(checkBox2);
}
}
}
public void imageFieldMerging(ImageFieldMergingArgs args) throws Exception {
// Do nothing.
}
private DocumentBuilder mBuilder;
});
doc.getMailMerge().executeWithRegions(Q419);
doc.save(MyDir + “output.docx”);
Aspose.Words 插入正确的复选框。 请在上面的代码中添加 System.out.println 来检查 Fridge 变量是否为真值。 请检查冰箱的值,并在相应条件下使用。
謝謝!有測試可顯示出預期的效果。