您好,
一个word文件, 一共有N章, 每章的标题样式都是 标题一
能否按 标题一 样式为准, 将标题及其下内容抽取出来另存为一个新的docx文件, 每个文件名就是标题一的文本?
我有VBA的相关代码, 在Spire.doc中能执行VBA代码吗? 有相关的代码可以参考吗? 非常感谢
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;
}
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
//页面尺寸
newSec.PageSetup.PageSize = section.PageSetup.PageSize;
//页边距
newSec.PageSetup.Margins = section.PageSetup.Margins;
//页眉页脚边距
newSec.PageSetup.HeaderDistance = section.PageSetup.HeaderDistance;
newSec.PageSetup.FooterDistance = section.PageSetup.FooterDistance;
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
Nina.Tang wrote:您好,
拆分后的文档是无法自动保持原文档的网格属性的,并且我们产品目前也不支持获取原文档的网格属性以及设置到新文档。你现在只能将原始文档的网格属性取消(设置为无网格)。如果你手动修改生成文档的网格属性,也需要将每页设置为50行以及15.6磅值才能达到和原始文档一样的效果。
目前文档网格新功能正在开发中,抱歉我暂时还给不了一个具体的发布时间。如果我们内部得到了关于发布的消息,我会及时反馈到你的。感谢理解~
Sincerely,
Nina
E-iceblue support team
Nina.Tang wrote:你好,
我会在此帖子上通知你,你也可以在此链接底部订阅新闻:https://www.e-iceblue.cn/news-spire-doc.html,每次有新的发布会自动发送到你邮箱。
Sincerely,
Nina
E-iceblue support team
Spire.Doc.Section section = doc.Sections[0];
section.PageSetup.GridType = GridPitchType.LinesOnly;
section.PageSetup.LinesPerPage = 43;
//页面尺寸
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
Nina.Tang wrote:您好,
生成文件有水印是因为您使用的10.11.0是我们的最新商业版,您需要拥有授权才能移除商业版产生的警告水印以及功能限制。
对于您说的分割后的文档内容和原文档有出入,您指的是第一页的内容下移到第二页了吧?请看如下附图。经调查这是由于我们产品内部对于文档网格每页行的间距值计算有偏差导致的,我将此问题反馈到了研发进行修复,问题编号为SPIREDOC-8803,有任何好消息,我会及时反馈到您的。
Sincerely,
Nina
E-iceblue support team
Nina.Tang wrote:您好,
我复现了这个问题,已将其移交给研发进行调查和修复,编号为SPIREDOC-8590。如果有任何进展我会及时反馈到你。
Sincerely,
Nina
E-iceblue support team
//加载原始文档
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);