如何把word範本中的checkbox移除

你好:
我在word中有想要移除由範本中某一個checkbox,但不成功,運作方式是根據DB紀錄生成表格,然後再經由游標到達bookmark處移除checkbox。但是總是顯示 java.lang.NullPointerException,程式碼和word範本如附件,再麻煩協助,謝謝!checkboxRemove.7z (24.8 KB)

@lfengh

不幸的是,我们无法执行您的代码,因为您通过 queryFromPool 从数据库获取日期。

请创建一个简单的 Java 应用程序(没有编译错误的源代码),以帮助我们在我们端重现您的问题并将其附在此处进行测试。

然后,我们将调查该问题并为您提供更多相关信息。

@tahir.manzoor
已調整需求,目前是想經由範本產生含有checkbox的檔案(經由程式判別Y或N),但是當範本產生之後,檔案內容卻是StructuredDocumentTag的字樣,這部分是需要如何調整的呢?

範本檔中插入checkbox.7z

@lfengh

我们正在调查您的问题,并会尽快回复您。

@lfengh

我们已经删除了 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)

@lfengh

我们正在为您的场景编写代码,很快就会回复您。

@lfengh

请将光标移动到表格单元格内的书签并插入内容控件(复选框)。 请检查以下代码示例。

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");

@tahir.manzoor
謝謝您的幫忙,依照代碼套入但結果卻變成如附件所示,每一列都顯示全部的結果,要如何調整每列只顯示單獨2個嗎?word檔中插入checkbox.7z (45.4 KB)

@lfengh

您能否使用 MS Word 手动创建您预期的输出 Word 文档并附在此处以供我们参考? 然后,我们将根据您的要求为您提供代码示例。

@tahir.manzoor
您好,我想呈如附件檔案中的樣式,謝謝!Q-4-19.docx (24.2 KB)

@lfengh

请实现 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 变量是否为真值。 请检查冰箱的值,并在相应条件下使用。

謝謝!有測試可顯示出預期的效果。