使用apache POI读取重复节的内容

时间:2018-01-17 11:54:31

标签: ms-word apache-poi

我有一个带有重复部分的word文档,其中包含其他内容控件。 在java项目中,我有一个函数可以从列表列表中的apache POI中的word文档中获取所有sdts(内容控件)。 当我检查该列表中的重复部分时,我可以在所有内容控件内部(在我的重复部分内)获取文本,但是作为长段而不是其他sdt节点。 有没有办法用Apache POI检查重复部分sdt的内容?我在doc

中找不到任何相关内容

获取所有sdts的功能 私有静态列表

if object_id('dbo.[MSPCompanies]') is not null drop table dbo.[MSPCompanies];
if object_id('dbo.[MSPTempTable]') is not null drop table dbo.[MSPTempTable];

create table dbo.[MSPTempTable]
(
    MSP_Companies_ID    int identity(1,1),
    INN                 varchar(5) primary key clustered,
    [Name]              varchar(20),
    ShortName           varchar(20),
    FIO                 varchar(20),
    SubjectType         varchar(20),
    SubjectCategory     varchar(20)
);

insert into dbo.[MSPTempTable] (inn,
 [Name]         
,ShortName      
,FIO            
,SubjectType    
,SubjectCategory) values ('a','a','a','a','a','a'),     ('a2','a2','a2','a2','a2','a2');

create table dbo.[MSPCompanies]
(
    MSP_Companies_ID    int identity(1,1),
    INN                 varchar(5) primary key clustered,
    [Name]              varchar(20),
    ShortName           varchar(20),
    FIO                 varchar(20),
    SubjectType         varchar(20),
    SubjectCategory     varchar(20)
);

insert into dbo.[MSPCompanies] (inn,
 [Name]         
,ShortName      
,FIO            
,SubjectType    
,SubjectCategory) values ('a','a','a','a','a','a');

begin tran
set xact_abort on;

SET NOCOUNT ON;

 DECLARE @SummaryOfChanges TABLE(
    CompanyID int,
    Change VARCHAR(20)
 ); 


 MERGE INTO [MSPCompanies] AS [Target]
    USING [MSPTempTable] AS [Source]
        ON Target.MSP_Companies_ID = Source.MSP_Companies_ID
    WHEN MATCHED THEN
        UPDATE SET 
             Target.Name = Source.Name,
             Target.ShortName = Source.ShortName,
             Target.FIO = Source.FIO,
             Target.SubjectType = Source.SubjectType,
             Target.SubjectCategory = Source.SubjectCategory
    WHEN NOT MATCHED THEN
        INSERT  (INN, Name, ShortName, FIO, SubjectType, SubjectCategory) 
        VALUES  (Source.INN, Source.Name, Source.ShortName, Source.FIO,     Source.SubjectType, Source.SubjectCategory)

    OUTPUT inserted.MSP_Companies_ID, $action INTO @SummaryOfChanges;

SELECT * from dbo.[MSPCompanies]
SELECT * from @SummaryOfChanges;

if @@TRANCOUNT > 0 
    rollback tran;

1 个答案:

答案 0 :(得分:0)

XWPF的{​​{1}}部分至今尚未成熟,而且处于高度发展阶段。在XWPFSDT中也提到了这一点:“提供StructuredDocumentTags / ContentControl的基本只读处理的实验类”。因此,到目前为止,您的代码仅获取重复内容控件的周围apache poi,而不是内部控件。人们可以通过代码中的一些调试输出看到。查看我的XWPFSDT

因此,为了真正获得所有System.out.println(...),我们必须直接使用底层XWPFSDT

让我们有一个完整的例子。

查看此XML文档:

enter image description here

如您所见,只有一个控件可以输入组名称,然后围绕三个控件重复内容控件以输入名称,金额和日期,然后输入一个控件来输入员工。应读取的所有控件都设置了标题。因此,标题是否设定,是控制是否对阅读很重要的标准。

以下代码现在可以读取所有控件及其内容:

Word