为有中文需求的客户提供多渠道中文技术支持.

Sun Oct 09, 2022 1:47 am

您好,

一个word文件, 一共有N章, 每章的标题样式都是 标题一

能否按 标题一 样式为准, 将标题及其下内容抽取出来另存为一个新的docx文件, 每个文件名就是标题一的文本?

我有VBA的相关代码, 在Spire.doc中能执行VBA代码吗? 有相关的代码可以参考吗? 非常感谢

keLi1680
 
Posts: 30
Joined: Sun Oct 02, 2022 2:35 am

Sun Oct 09, 2022 7:27 am

您好,

感谢咨询!
请参考下面的代码实现你的需求,有问题请随时反馈。
Code: Select all
 static void Main(string[] args)
 {//加载原始文档
Document document = new Document();
document.LoadFromFile(@"D:\\Test.docx");
//创建新文档
Document newDoc = new Document();
Section newSec = newDoc.AddSection();
string name="start";
//遍历所有章节
foreach (Section section in document.Sections)
{
    foreach (DocumentObject documentObject in section.Body.ChildObjects)
    {
        document.CloneCompatibilityTo(newDoc);
        document.CloneDefaultStyleTo(newDoc);
        //拷贝内容
        newSec.Body.ChildObjects.Add(documentObject.Clone());
        //IsHeading1方法判断当前元素是否是标题1
        if (IsHeading1(documentObject))
        {
            //移除拷贝的最后一个元素
            newSec.Body.ChildObjects.RemoveAt(newSec.Body.ChildObjects.Count-1);
            //保存文档
            newDoc.SaveToFile(name + ".docx", Spire.Doc.FileFormat.Docx2013);
            //获取章节的文本
            Paragraph para = documentObject as Paragraph;
            name = para.Text;
            //创建新的文档并拷贝内容
            newDoc = new Document();
            newSec = newDoc.AddSection();
            newSec.Body.ChildObjects.Add(documentObject.Clone());
        }
    }
}
newDoc.SaveToFile(name+".docx", Spire.Doc.FileFormat.Docx2013);}
 private static bool IsHeading1(DocumentObject documentObject)
 {
     bool result = false;

     if (documentObject is Paragraph)
     {
         Paragraph paragraph = documentObject as Paragraph;
         if (paragraph.Format.OutlineLevel == OutlineLevel.Level1)
         {
             result = true;
         }
     }
     return result;
 }

Sincerely,
Nina
E-iceblue support team
User avatar

Nina.Tang
 
Posts: 1182
Joined: Tue Sep 27, 2016 1:06 am

Mon Oct 10, 2022 3:13 am

Nina.Tang wrote:您好,

感谢咨询!
请参考下面的代码实现你的需求,有问题请随时反馈。
Code: Select all
 static void Main(string[] args)
 {//加载原始文档
Document document = new Document();
document.LoadFromFile(@"D:\\Test.docx");
//创建新文档
Document newDoc = new Document();
Section newSec = newDoc.AddSection();
string name="start";
//遍历所有章节
foreach (Section section in document.Sections)
{
    foreach (DocumentObject documentObject in section.Body.ChildObjects)
    {
        document.CloneCompatibilityTo(newDoc);
        document.CloneDefaultStyleTo(newDoc);
        //拷贝内容
        newSec.Body.ChildObjects.Add(documentObject.Clone());
        //IsHeading1方法判断当前元素是否是标题1
        if (IsHeading1(documentObject))
        {
            //移除拷贝的最后一个元素
            newSec.Body.ChildObjects.RemoveAt(newSec.Body.ChildObjects.Count-1);
            //保存文档
            newDoc.SaveToFile(name + ".docx", Spire.Doc.FileFormat.Docx2013);
            //获取章节的文本
            Paragraph para = documentObject as Paragraph;
            name = para.Text;
            //创建新的文档并拷贝内容
            newDoc = new Document();
            newSec = newDoc.AddSection();
            newSec.Body.ChildObjects.Add(documentObject.Clone());
        }
    }
}
newDoc.SaveToFile(name+".docx", Spire.Doc.FileFormat.Docx2013);}
 private static bool IsHeading1(DocumentObject documentObject)
 {
     bool result = false;

     if (documentObject is Paragraph)
     {
         Paragraph paragraph = documentObject as Paragraph;
         if (paragraph.Format.OutlineLevel == OutlineLevel.Level1)
         {
             result = true;
         }
     }
     return result;
 }

Sincerely,
Nina
E-iceblue support team

非常感谢您的帮助!

发现一个问题: 拆分出来的文件, 标题的段落格式, 页边距, 页眉和页脚的边距, 都发生了变化! 如下图所示

这个测试文件实际上是由三个文件拼起来的(每章一个文件), 每个文件的章标题全都位于文件的最开头

可以让拆分出来的每个文件和原文件, 在标题+正文格式, 页边距, 页眉和页脚的边距, 等各方面完全保持一致吗? 再次感谢!

之前.png


之后.png

keLi1680
 
Posts: 30
Joined: Sun Oct 02, 2022 2:35 am

Mon Oct 10, 2022 8:40 am

您好,

请添加下面的代码使拆分后的文档与原始文档保持相同的页面尺寸,页边距以及页眉页脚边距。
Code: Select all
//页面尺寸
newSec.PageSetup.PageSize = section.PageSetup.PageSize;
//页边距
newSec.PageSetup.Margins = section.PageSetup.Margins;
//页眉页脚边距
newSec.PageSetup.HeaderDistance = section.PageSetup.HeaderDistance;
newSec.PageSetup.FooterDistance = section.PageSetup.FooterDistance;

对于你截图中的标题下方的空白问题,经调查我发现这是由于你的原始文档设置了文档网格属性,请看下图。我们产品目前还不支持获取以及设置文档网格,会考虑在后期实现此功能,届时再通知到你。

Sincerely,
Nina
E-iceblue support team
User avatar

Nina.Tang
 
Posts: 1182
Joined: Tue Sep 27, 2016 1:06 am

Tue Oct 11, 2022 12:47 am

Nina.Tang wrote:您好,

请添加下面的代码使拆分后的文档与原始文档保持相同的页面尺寸,页边距以及页眉页脚边距。
Code: Select all
//页面尺寸
newSec.PageSetup.PageSize = section.PageSetup.PageSize;
//页边距
newSec.PageSetup.Margins = section.PageSetup.Margins;
//页眉页脚边距
newSec.PageSetup.HeaderDistance = section.PageSetup.HeaderDistance;
newSec.PageSetup.FooterDistance = section.PageSetup.FooterDistance;

对于你截图中的标题下方的空白问题,经调查我发现这是由于你的原始文档设置了文档网格属性,请看下图。我们产品目前还不支持获取以及设置文档网格,会考虑在后期实现此功能,届时再通知到你。

Sincerely,
Nina
E-iceblue support team


感谢您的帮助,

原文档的网格, 每页行数 50 跨度 15.6
我手动修改 导出后的文档的网络, 每页行数设为 50后, 跨度会变为 15.7 还是和原文档不一致

有其它折中的办法解决上面的问题吗? 实际应用中的刚性需要,

实现文档网格的获取和设置有发布时间表吗? 感谢!

keLi1680
 
Posts: 30
Joined: Sun Oct 02, 2022 2:35 am

Tue Oct 11, 2022 2:23 am

您好,

拆分后的文档是无法自动保持原文档的网格属性的,并且我们产品目前也不支持获取原文档的网格属性以及设置到新文档。你现在只能将原始文档的网格属性取消(设置为无网格)。如果你手动修改生成文档的网格属性,也需要将每页设置为50行以及15.6磅值才能达到和原始文档一样的效果。
目前文档网格新功能正在开发中,抱歉我暂时还给不了一个具体的发布时间。如果我们内部得到了关于发布的消息,我会及时反馈到你的。感谢理解~

Sincerely,
Nina
E-iceblue support team
User avatar

Nina.Tang
 
Posts: 1182
Joined: Tue Sep 27, 2016 1:06 am

Tue Oct 11, 2022 8:18 am

Nina.Tang wrote:您好,

拆分后的文档是无法自动保持原文档的网格属性的,并且我们产品目前也不支持获取原文档的网格属性以及设置到新文档。你现在只能将原始文档的网格属性取消(设置为无网格)。如果你手动修改生成文档的网格属性,也需要将每页设置为50行以及15.6磅值才能达到和原始文档一样的效果。
目前文档网格新功能正在开发中,抱歉我暂时还给不了一个具体的发布时间。如果我们内部得到了关于发布的消息,我会及时反馈到你的。感谢理解~

Sincerely,
Nina
E-iceblue support team


您好, 请问 设置文档网格 功能发布后, 是给发邮件, 还是在这个贴子下回复? 谢谢

keLi1680
 
Posts: 30
Joined: Sun Oct 02, 2022 2:35 am

Tue Oct 11, 2022 8:51 am

你好,

我会在此帖子上通知你,你也可以在此链接底部订阅新闻:https://www.e-iceblue.cn/news-spire-doc.html,每次有新的发布会自动发送到你邮箱。

Sincerely,
Nina
E-iceblue support team
User avatar

Nina.Tang
 
Posts: 1182
Joined: Tue Sep 27, 2016 1:06 am

Wed Oct 19, 2022 2:38 am

您好,
除了上边报告的网格问题外, 如果页内有分栏的情况, 也有出现格式偏差情况

下面是示例文件

Nina.Tang wrote:你好,

我会在此帖子上通知你,你也可以在此链接底部订阅新闻:https://www.e-iceblue.cn/news-spire-doc.html,每次有新的发布会自动发送到你邮箱。

Sincerely,
Nina
E-iceblue support team

keLi1680
 
Posts: 30
Joined: Sun Oct 02, 2022 2:35 am

Wed Oct 19, 2022 7:46 am

您好,

我复现了这个问题,已将其移交给研发进行调查和修复,编号为SPIREDOC-8590。如果有任何进展我会及时反馈到你。

Sincerely,
Nina
E-iceblue support team
User avatar

Nina.Tang
 
Posts: 1182
Joined: Tue Sep 27, 2016 1:06 am

Fri Nov 11, 2022 8:32 am

您好,

很高兴通知您我们发布了Spire.Doc Pack(hot fix)版本: 10.11.0,支持设置网格属性。请下载新版本并使用下面的代码进行尝试。
官网下载地址:https://www.e-iceblue.com/Download/download-word-for-net-now.html
Nuget下载地址:https://www.nuget.org/packages/Spire.Doc/
Code: Select all
Spire.Doc.Section section = doc.Sections[0];
section.PageSetup.GridType = GridPitchType.LinesOnly;
section.PageSetup.LinesPerPage = 43;

Sincerely,
Nina
E-iceblue support team
User avatar

Nina.Tang
 
Posts: 1182
Joined: Tue Sep 27, 2016 1:06 am

Tue Nov 22, 2022 4:20 am

不好意思, 刚看到回复!

我加了下面的代码, 生成的文件, 有水印, 我删除水印, 发现分割后的每章内容还是和原文有出入
因为每页里的文字是一种颜色, 所有效果很好确认, 附件也是原来的文件

麻烦核审一下最终效果, 谢谢

Code: Select all
         //页面尺寸
         newSec.PageSetup.PageSize = section.PageSetup.PageSize;
         //页边距
         newSec.PageSetup.Margins = section.PageSetup.Margins;
         //页眉页脚边距
         newSec.PageSetup.HeaderDistance = section.PageSetup.HeaderDistance;
         newSec.PageSetup.FooterDistance = section.PageSetup.FooterDistance;

         //设置文档网格属性
         newSec.PageSetup.GridType = GridPitchType.LinesOnly;
         newSec.PageSetup.LinesPerPage = section.PageSetup.LinesPerPage;



Nina.Tang wrote:您好,

很高兴通知您我们发布了Spire.Doc Pack(hot fix)版本: 10.11.0,支持设置网格属性。请下载新版本并使用下面的代码进行尝试。
官网下载地址:https://www.e-iceblue.com/Download/download-word-for-net-now.html
Nuget下载地址:https://www.nuget.org/packages/Spire.Doc/
Code: Select all
Spire.Doc.Section section = doc.Sections[0];
section.PageSetup.GridType = GridPitchType.LinesOnly;
section.PageSetup.LinesPerPage = 43;

Sincerely,
Nina
E-iceblue support team

keLi1680
 
Posts: 30
Joined: Sun Oct 02, 2022 2:35 am

Tue Nov 22, 2022 7:22 am

您好,

生成文件有水印是因为您使用的10.11.0是我们的最新商业版,您需要拥有授权才能移除商业版产生的警告水印以及功能限制。
对于您说的分割后的文档内容和原文档有出入,您指的是第一页的内容下移到第二页了吧?请看如下附图。经调查这是由于我们产品内部对于文档网格每页行的间距值计算有偏差导致的,我将此问题反馈到了研发进行修复,问题编号为SPIREDOC-8803,有任何好消息,我会及时反馈到您的。

Sincerely,
Nina
E-iceblue support team
User avatar

Nina.Tang
 
Posts: 1182
Joined: Tue Sep 27, 2016 1:06 am

Tue Nov 22, 2022 8:35 am

感谢回复!

我测试的情况和你的情况是一样的!

拆分后的各章节文件和原文件需要保持一致, 是工作的硬性需要, 问题解决后请与我联系, 多谢

Nina.Tang wrote:您好,

生成文件有水印是因为您使用的10.11.0是我们的最新商业版,您需要拥有授权才能移除商业版产生的警告水印以及功能限制。
对于您说的分割后的文档内容和原文档有出入,您指的是第一页的内容下移到第二页了吧?请看如下附图。经调查这是由于我们产品内部对于文档网格每页行的间距值计算有偏差导致的,我将此问题反馈到了研发进行修复,问题编号为SPIREDOC-8803,有任何好消息,我会及时反馈到您的。

Sincerely,
Nina
E-iceblue support team

keLi1680
 
Posts: 30
Joined: Sun Oct 02, 2022 2:35 am

Wed Apr 12, 2023 2:32 am

Nina.Tang wrote:您好,

我复现了这个问题,已将其移交给研发进行调查和修复,编号为SPIREDOC-8590。如果有任何进展我会及时反馈到你。

Sincerely,
Nina
E-iceblue support team


您好,

感谢您的耐心等待。对于SPIREDOC-8590拆分文档后丢失分栏的问题,请在原有代码上增加设置分栏的代码。
示例代码如下:
Code: Select all
//加载原始文档
            Document document = new Document();
            document.LoadFromFile("Test2.docx");
            //创建新文档
            Document newDoc = new Document();
            Spire.Doc.Section newSec = newDoc.AddSection();

            string name = "start";
            //遍历所有章节
            foreach (Spire.Doc.Section section in document.Sections)
            {
                int columnCount = section.Columns.Count;
                float space=0;
                if (columnCount > 1)
                {
                    space = section.Columns[0].Space;
                }
               
                foreach (DocumentObject documentObject in section.Body.ChildObjects)
                {
                    document.CloneCompatibilityTo(newDoc);
                    document.CloneDefaultStyleTo(newDoc);
                    //页面尺寸
                    newSec.PageSetup.PageSize = section.PageSetup.PageSize;
                    //页边距
                    newSec.PageSetup.Margins = section.PageSetup.Margins;
                    //页眉页脚边距
                    newSec.PageSetup.HeaderDistance = section.PageSetup.HeaderDistance;
                    newSec.PageSetup.FooterDistance = section.PageSetup.FooterDistance;
                    if (columnCount >1)
                    {
                       //设置分栏
                        newSec.Columns.Populate(columnCount, space);
                    }
                       
                    //拷贝内容
                    newSec.Body.ChildObjects.Add(documentObject.Clone());
                    //IsHeading1方法判断当前元素是否是标题1
                    if (IsHeading1(documentObject))
                    {
                        //移除拷贝的最后一个元素
                        newSec.Body.ChildObjects.RemoveAt(newSec.Body.ChildObjects.Count - 1);
                        //保存文档
                        newDoc.SaveToFile(name + ".docx", Spire.Doc.FileFormat.Docx2013);
                        //获取章节的文本
                        Paragraph para = documentObject as Paragraph;
                        name = para.Text;
                        //创建新的文档并拷贝内容
                        newDoc = new Document();
                        newSec = newDoc.AddSection();
                        if (columnCount > 1)
                        {
                         //设置分栏
                            newSec.Columns.Populate(columnCount, space);
                        }
                        //页面尺寸
                        newSec.PageSetup.PageSize = section.PageSetup.PageSize;
                        //页边距
                        newSec.PageSetup.Margins = section.PageSetup.Margins;
                        //页眉页脚边距
                        newSec.PageSetup.HeaderDistance = section.PageSetup.HeaderDistance;
                        newSec.PageSetup.FooterDistance = section.PageSetup.FooterDistance;
                        newSec.Body.ChildObjects.Add(documentObject.Clone());
                    }
                }

                newDoc.SaveToFile(name + ".docx", Spire.Doc.FileFormat.Docx2013);


Sincerely,
Amy
E-iceblue support team
User avatar

amy.zhao
 
Posts: 2766
Joined: Wed Jun 27, 2012 8:50 am

Return to 中文技术支持