Spire.PDF for Python 10.5.2 现已正式发布。该版本支持了 table.GetText(i,j) 方法,用于获取 PDF 表格单元格中的文本,还同步了 PdfTextExtractor、PdfTextFinder 和 PdfCompressor 等多个接口。详情请查阅以下内容。
新功能:
单元格边框在提高 Excel 电子表格的视觉清晰度和数据组织方面起着至关重要的作用。为单元格添加边框有助于吸引对特定数据点的注意、突出标题或在工作表的不同部分之间创建清晰的边界。另一方面,移除边框可以提供光滑无缝的外观,尤其是当你想排除干扰,只关注数据本身时。
在本综合指南中,我们将指导你使用 Spire.XLS for Python 在 Python 中添加或删除 Excel 中单元格边框。
本教程需要 Spire.XLS for Python 和 plum-dispatch v1.7.4。您可以通过以下 pip 命令将它们轻松安装到 Windows 中。
pip install Spire.XLS
如果您不确定如何安装,请参考此教程: 如何在 Windows 中安装 Spire.XLS for Python
边框可应用于单个单元格、单元格组甚至整个单元格区域,以创建清晰的边界并使数据更突出。通过添加边框,你可以有效地组织和结构化数据,使其更易于分析和理解。
使用 Spire.XLS for Python,可以通过 Worksheet.Range[name: str] 属性轻松访问特定的单元格或单元格区域。一旦获得所需的单元格或单元格区域,就可以使用 CellRange.BorderAround() 方法应用外部边界。此外,还可以使用 CellRange.BorderInside() 方法为单元格区域应用内边框。
要为单元格或单元格区域应用边框,请按照以下步骤操作。
from spire.xls import *
from spire.xls.common import *
# 创建一个Workbook对象
workbook = Workbook()
# 加载示例文档
workbook.LoadFromFile("示例文档.xlsx")
# 获取第一个Worksheet
worksheet = workbook.Worksheets[0]
# 获取C11单元格
cell = worksheet.Range["C11"]
# 为C11单元格添加中等粗细的四周边框,颜色为黑色
cell.BorderAround(LineStyleType.Medium, Color.get_Black())
# 获取B2到C6的单元格范围
cellRange = worksheet.Range["B2:C6"]
# 为B2到C6的单元格范围添加细边框,颜色为黑色
cellRange.BorderAround(LineStyleType.Thin, Color.get_Black())
# 为B2到C6的单元格范围添加内部细边框,颜色为黑色
cellRange.BorderInside(LineStyleType.Thin, Color.get_Black())
# 将Workbook保存为新的文件
workbook.SaveToFile("指定单元格添加边框.xlsx", ExcelVersion.Version2016)
workbook.Dispose()

工作表中包含数据的区域通常称为“分配区域”或“使用区域”。它表示包含所有数据单元格的矩形区域,包括文本、数字、公式和其他类型的内容。
要检索包含数据的单元格区域,请使用 Worksheet.AllocatedRange 属性。然后,使用 BorderAround() 和 BorderInside() 方法就可以轻松地为该单元格区域添加边框。
为包含数据的单元格区域添加边框的步骤如下。
from spire.xls import *
from spire.xls.common import *
# 创建一个Workbook对象
workbook = Workbook()
# 加载示例文档
workbook.LoadFromFile("示例文档.xlsx")
# 获取第一个Worksheet
worksheet = workbook.Worksheets[0]
# 获取Worksheet的已分配范围(即包含数据的范围)
locatedRange = worksheet.AllocatedRange
# 在已分配范围的四周添加中等虚线边框,颜色为黑色
locatedRange.BorderAround(LineStyleType.MediumDashed, Color.get_Black())
# 在已分配范围的内部添加细线边框,颜色为黑色
locatedRange.BorderInside(LineStyleType.Thin, Color.get_Black())
# 将Workbook保存为新的文件
workbook.SaveToFile("指定单元格范围添加边框.xlsx", ExcelVersion.Version2016)
workbook.Dispose()

除了应用外边框和内边框外,您还可以为单个单元格或单元格区域添加左、上、右、下和对角线边框。这项功能让你超越基本的边框定制,提供更多灵活性来突出重要信息、分隔工作表中的部分或为数据提供可视化结构。
通过 CellRange.Borders[BordersLineType.EdgeLeft] 等属性,Spire.XLS 可方便地访问特定边框,包括左、右、上、下和对角线边框。获得所需的边框后,您可以利用 IBorder.LineStyle 属性和 IBorder.Color 属性灵活定制其外观。
要为单元格添加左、上、右、下和对角线边框,请按照以下步骤操作。
from spire.xls import *
from spire.xls.common import *
# 创建一个Workbook对象
workbook = Workbook()
# 加载示例文档
workbook.LoadFromFile("示例文档.xlsx")
# 获取第一个Worksheet
worksheet = workbook.Worksheets[0]
# 获取B11单元格
cell = worksheet.Range["B11"]
# 分别获取单元格的左边框、上边框、右边框和下边框
leftBorder = cell.Borders[BordersLineType.EdgeLeft]
topBorder = cell.Borders[BordersLineType.EdgeTop]
rightBorder = cell.Borders[BordersLineType.EdgeRight]
bottomBorder = cell.Borders[BordersLineType.EdgeBottom]
# 设置左边框为粗线
leftBorder.LineStyle = LineStyleType.Thick
# 设置上边框为点线
topBorder.LineStyle = LineStyleType.Dotted
# 设置右边框为斜划线点
rightBorder.LineStyle = LineStyleType.SlantedDashDot
# 设置下边框为双线
bottomBorder.LineStyle = LineStyleType.Double
# 设置左边框颜色为红色
leftBorder.Color = Color.get_Red()
# 设置上边框颜色为棕色
topBorder.Color = Color.get_Brown()
# 设置右边框颜色为深灰色
rightBorder.Color = Color.get_DarkGray()
# 设置下边框颜色为橙红色
bottomBorder.Color = Color.get_OrangeRed()
# 获取C10单元格
cell = worksheet.Range["C10"]
# 获取C10单元格的对角线下边框(假设库支持此属性)
diagonalBorder = cell.Borders[BordersLineType.DiagonalDown]
# 设置对角线下边框为细线(注意:不是所有库都支持对角线边框)
diagonalBorder.LineStyle = LineStyleType.Thin
# 将Workbook保存为新的文件
workbook.SaveToFile("添加边缘边框.xlsx", ExcelVersion.Version2016)
workbook.Dispose()

边框可以从单个单元格、单元格组甚至整个范围中移除,从而减少视觉干扰和杂乱,使数据更易于解释和分析。此外,您还可以选择删除单元格特定边框,如左侧、顶部、右侧或底部,这可以改变视觉外观并增强整体演示效果。
要消除单元格或单元格区域周围或内部的边框,只需将 CellRange.Borders.LineStyle 属性设置为 LineStyleType.none 即可。同样,如果要移除特定边(如左侧)上的边框,可以将 CellRange.Borders[BordersLineType.EdgeLeft].LineStyle 属性设置为 LineStyleType.none。
删除单元格或单元格区域边框的步骤如下。
from spire.xls import *
from spire.xls.common import *
# 创建一个Workbook对象
workbook = Workbook()
# 加载输入文件
workbook.LoadFromFile("边框示例文档.xlsx")
# 获取第一个Worksheet
worksheet = workbook.Worksheets[0]
# 获取C11单元格
cell = worksheet.Range["C11"]
# 将C11单元格的所有边框样式设置为无
cell.Borders.LineStyle = LineStyleType.none
# 如果只想删除C11单元格的某一边框(如左边框)
# cell.Borders[BordersLineType.EdgeLeft].LineStyle = LineStyleType.none
# 获取B2到C6的单元格范围
cellRange = worksheet.Range["B2:C6"]
# 将B2到C6的单元格范围的所有边框样式设置为无
cellRange.Borders.LineStyle = LineStyleType.none
# 将Workbook保存为新的文件
workbook.SaveToFile("删除边框.xlsx", ExcelVersion.Version2016)
workbook.Dispose()
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。
Excel 文件通常包含敏感和机密信息,如财务数据、个人信息、商业秘密或专有公式。在互联网上或组织之间共享这些文件时,可能存在数据泄漏、被盗或未经授权修改的风险。为了解决这个问题,Excel 提供了一套全面的保护功能,如密码保护工作簿、限制工作表的编辑和锁定单元格等,使用户能够建立多层安全机制来控制数据访问和维护 Excel 文件的完整性。本文将介绍如何使用 Spire.XLS for Python 在 Python 中保护和解除对 Excel 工作簿和工作表的保护。
本教程需要 Spire.XLS for Python 和 plum-dispatch v1.7.4。您可以通过以下 pip 命令将它们轻松安装到 Windows 中。
pip install Spire.XLS
如果您不确定如何安装,请参考此教程: 如何在 Windows 中安装 Spire.XLS for Python
通过使用密码对 Excel 文档进行加密,可以确保文档中的数据安全,未经授权的个人无法访问。以下是使用 Spire.XLS for Python 对工作簿进行密码保护的步骤。
from spire.xls import *
from spire.xls.common import *
# 创建一个新的Workbook对象
workbook = Workbook()
# 从现有的Excel文件加载工作簿
workbook.LoadFromFile("示例文档.xlsx")
# 对整个工作簿进行保护,设置密码为"password-123"
workbook.Protect("password-123")
# 将工作簿保存为新的Excel文件,版本为2016
workbook.SaveToFile("加密文档.xlsx", ExcelVersion.Version2016)
workbook.Dispose()

如果想授权他人查看 Excel 文档,同时限制他们对工作表的更改类型,可以使用特定的保护类型来保护工作表。下表列出了 SheetProtectionType 枚举中各种预定义的保护类型。
| 保护类型 | 允许用户操作内容 |
| Content | 修改或插入内容 |
| DeletingColumns | 删除列 |
| DeletingRows | 删除行 |
| Filtering | 设置筛选器 |
| FormattingCells | 设置单元格格式 |
| FormattingColumns | 列格式 |
| FormattingRows | 行格式 |
| InsertingColumns | 插入列 |
| InsertingRows | 插入行 |
| InsertingHyperlinks | 插入超链接 |
| LockedCells | 选择锁定的单元格 |
| UnlockedCells | 选择未锁定的单元格 |
| Objects | 修改绘画对象 |
| Scenarios | 修改已保存的场景 |
| Sorting | 数据排序 |
| UsingPivotTables | 使用透视表和透视图 |
| All | 在受保护的工作表上执行上面列出的任何操作 |
| none | 在受保护的工作表上不做任何操作 |
以下步骤将演示如何使用 Spire.XLS for Python 以特定保护类型保护工作表。
from spire.xls import *
from spire.xls.common import *
# 创建一个新的Workbook对象
workbook = Workbook()
# 从现有的Excel文件加载工作簿
workbook.LoadFromFile("示例文档.xlsx")
# 获取工作簿中的第一个工作表
worksheet = workbook.Worksheets[0]
# 对工作表进行保护,设置密码为"password-permission",不限制任何权限
worksheet.Protect("password-permission", SheetProtectionType.none)
# 将工作簿保存为新的Excel文件,版本为2016
workbook.SaveToFile("保护工作表.xlsx", ExcelVersion.Version2016)
workbook.Dispose()

可以通过 ExcelPicture.TopRow 属性和 ExcelPicture.LeftColumn 属性设置或获取图像的起始位置。要在同一工作表中移动图像,请按照以下步骤进行操作:
from spire.xls import *
from spire.xls.common import *
# 创建一个新的Workbook对象
workbook = Workbook()
# 从现有的Excel文件加载工作簿
workbook.LoadFromFile("示例文档.xlsx")
# 获取工作簿中的第一个工作表
sheet = workbook.Worksheets[0]
# 添加允许编辑的范围,范围为A2:A4
sheet.AddAllowEditRange("范围一", sheet.Range["A2:A4"])
# 添加允许编辑的范围,范围为A5:C6
sheet.AddAllowEditRange("范围二", sheet.Range["A5:C6"])
# 对工作表进行保护,设置密码为"password-permission",限制所有编辑权限
sheet.Protect("password-permission", SheetProtectionType.All)
# 将工作簿保存为新的Excel文件,版本为2016
workbook.SaveToFile("允许编辑范围.xlsx", ExcelVersion.Version2016)
workbook.Dispose()

要解除受密码保护的工作表的保护,需要调用 Worksheet.Unprotect() 方法,并将原始密码作为参数传递给该方法。具体步骤如下:
from spire.xls import *
from spire.xls.common import *
# 创建一个新的Workbook对象
workbook = Workbook()
# 从Excel文件加载工作簿
workbook.LoadFromFile("保护工作表.xlsx")
# 获取工作簿中的第一个工作表
sheet = workbook.Worksheets[0]
# 解除工作表的保护,使用密码"password-permission"
sheet.Unprotect("password-permission")
# 将工作簿保存为新的Excel文件,版本为2016
workbook.SaveToFile("解除保护工作表.xlsx", ExcelVersion.Version2016)
workbook.Dispose()
要删除或重置加密工作簿的密码,可以使用 Workbook.Unprotect() 或 Workbook.Protect() 方法。以下步骤演示了如何加载加密 Excel 文档并删除或更改其密码:
from spire.xls import *
from spire.xls.common import *
# 创建一个新的Workbook对象
workbook = Workbook()
# 设置打开工作簿的密码为"password-123"
workbook.OpenPassword = "password-123"
# 从加密的Excel文件加载工作簿
workbook.LoadFromFile("加密文档.xlsx")
# 解除工作簿的保护
workbook.UnProtect()
#重置密码
# workbook.Protect("newpassword")
# 保存解密后的工作簿为新的Excel文件,版本为2016
workbook.SaveToFile("解密文档.xlsx", ExcelVersion.Version2016)
workbook.Dispose()
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。
在 Excel 中,依据透视表生成的图表可以将透视表的结果以图形的形式展示出来,使数据更直观、易于理解以帮助用户更好地分析数据。图表也可以方便地导出为图片,便于与他人共享和在演示中使用。因此,通过透视表生成图表这一功能在各领域和行业都有广泛的应用。本文将介绍如何使用 Spire.XLS for Java 在 Excel 文档中根据透视表创建操作图表。
首先,您需要将 Spire.Xls.jar 文件作为依赖项添加到您的 Java 程序中。可以从此链接下载 JAR 文件。如果您使用 Maven,您可以通过将以下代码添加到项目的 pom.xml 文件中轻松地在应用程序中导入 JAR 文件。
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.xls</artifactId>
<version>16.9.2</version>
</dependency>
</dependencies>
要在 Excel 中根据透视表创建图表并针对图表的一些设置,请按照以下步骤操作:
import com.spire.xls.*;
import com.spire.xls.charts.ChartSerie;
import com.spire.xls.core.IPivotTable;
public class pivotFieldChart
{
public static void main(String[] args) throws Exception
{
// 创建一个Workbook对象
Workbook workbook = new Workbook();
// 加载含有透视表的原Excel文档
workbook.loadFromFile("in.xlsx");
// 获取第一个工作表
Worksheet sheet = workbook.getWorksheets().get(0);
// 获取第一个数据透视表
IPivotTable pivotTable = sheet.getPivotTables().get(0);
// 使用数据透视表作为数据源添加一个柱状图表
Chart chart = workbook.getWorksheets().get(0).getCharts().add(ExcelChartType.ColumnClustered, pivotTable);
// 设置图表的行和列位置
chart.setTopRow(19);
chart.setBottomRow(37);
chart.setLeftColumn(1);
chart.setRightColumn(9);
// 设置值轴不显示网格线
chart.getPrimaryValueAxis().hasMajorGridLines(false);
// 设置图例位置为右侧
chart.getLegend().setPosition(LegendPositionType.Right);
// 设置图表标题
chart.setChartTitle("Count Statistics");
// 获取图表第一个系列
ChartSerie cs = chart.getSeries().get(0);
// 设置系列的填充类型及颜色
cs.getFormat().getFill().setFillType(ShapeFillType.SolidColor);
cs.getFormat().getFill().setForeColor(java.awt.Color.ORANGE);
// 保存文件
workbook.saveToFile("out.xlsx", ExcelVersion.Version2013);
// 释放对象
workbook.dispose();
}
}

当透视表数据源发生改变后,使用 Spire.XLS for Java 可以设置数据透视表的缓存在加载时自动刷新。这样使得用透视表创建的图表数据也会跟着刷新,这样将确保透视表创建的图表数据与数据源同步,保证了数据分析的准确性。具体操作步骤如下:
import com.spire.xls.*;
import com.spire.xls.core.spreadsheet.pivottables.XlsPivotTable;
public class refreshChartData {
public static void main(String[] args) throws Exception {
// 创建一个Workbook对象
Workbook workbook = new Workbook();
// 加载原Excel文档
workbook.loadFromFile("in.xlsx");
// 获取第一个工作表
Worksheet sheet = workbook.getWorksheets().get(0);
//修改C5数据源
sheet.getRange().get("C5").setValue( "1000000");
// 获取第一个数据透视表
XlsPivotTable pivotTable =(XlsPivotTable) sheet.getPivotTables().get(0);
// 设置数据透视表的缓存在加载时自动刷新
pivotTable.getCache().isRefreshOnLoad(true);
//保存结果文档
workbook.saveToFile("out.xlsx", ExcelVersion.Version2013);
// 释放对象
workbook.dispose();
}
}

如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。
PDF 文档中的边距是指环绕每页内容的空白区域,充当文本或图像与页面边缘之间的缓冲区。在需要进行调整版式布局、加入批注或注解,以及准备文档打印或演示时,增加或减少 PDF 文档的页边距,能够得到更适合的页面空白区域,帮助用户更好地进行这些操作。
本文将介绍如何使用 Spire.PDF for Python 修改 PDF 文档的页边距,为不同使用场景定制合适的文档布局。
本教程需要用到 Spire.PDF for Python 和 plum-dispatch v1.7.4。可以通过以下 pip 命令将它们轻松安装到 Windows 中。
pip install Spire.PDF
如果您不清楚如何安装,请参考:如何在 Windows 中安装 Spire.PDF for Python
利用 Spire.PDF for Python,开发者可以通过创建一个新的 PDF 文档,并使该文档的页面大小等于原始文档的页面大小加上增加的页边距值,然后将原文档的每一页复制并粘贴(绘制)到新文档中,来实现增加 PDF 文档页边距的操作。
以下是使用 Python 增加 PDF 文档页边距的详细操作步骤:
from spire.pdf.common import *
from spire.pdf import *
# 创建一个PdfDocument对象
originalPdf = PdfDocument()
# 加载一个PDF文件
originalPdf.LoadFromFile("示例.pdf")
# 获取第一页
firstPage = originalPdf.Pages.get_Item(0)
# 创建另一个PdfDocument对象以创建新文档
newPdf = PdfDocument()
# 设置边距的增加值
marginsToAdd = newPdf.PageSettings.Margins
marginsToAdd.Top = 40
marginsToAdd.Bottom = 40
marginsToAdd.Left = 40
marginsToAdd.Right = 40
# 计算新页面的大小
sizeF = SizeF(firstPage.Size.Width + marginsToAdd.Left + marginsToAdd.Right, firstPage.Size.Height + marginsToAdd.Top + marginsToAdd.Bottom)
# 遍历原始文档中的页面
for i in range(originalPdf.Pages.Count):
# 基于特定页面创建一个模板
pdfTemplate = originalPdf.Pages.get_Item(i).CreateTemplate()
# 在新的PDF中添加一个页面
page = newPdf.Pages.Add(sizeF)
# 在页面上绘制模板
pdfTemplate.Draw(page, 0.0, 0.0)
# 保存新文档
newPdf.SaveToFile("output/增加PDF页边距.pdf", FileFormat.PDF)
# 释放资源
originalPdf.Dispose()
newPdf.Dispose()

同样,开发者可以通过创建一个新的 PDF 文档,并使该文档的页面大小等于原始文档的页面大小减去要减少的页边距值,然后将原始文档的每一页复制并粘贴(绘制)到新文档页面的相应位置,来实现减少 PDF 文档页边距的操作。
以下是使用 Python 减少 PDF 文档页边距的详细操作步骤:
from spire.pdf.common import *
from spire.pdf import *
# 创建一个PdfDocument对象
originalPdf = PdfDocument()
# 加载一个PDF文件
originalPdf.LoadFromFile("示例.pdf")
# 获取第一页
firstPage = originalPdf.Pages[0]
# 创建另一个PdfDocument对象
newPdf = PdfDocument()
# 设置边距的减少值
topToReduce = 20.0
bottomToReduce = 20.0
leftToReduce = 20.0
rightToReduce = 20.0
# 计算新页面的大小
sizeF = SizeF(firstPage.Size.Width - leftToReduce - rightToReduce, firstPage.Size.Height - topToReduce - bottomToReduce)
# 遍历原始文档中的页面
for i in range(originalPdf.Pages.Count):
# 基于特定页面创建一个模板
pdfTemplate = originalPdf.Pages[i].CreateTemplate()
# 在新的PDF中添加一个页面
page = newPdf.Pages.Add(sizeF, PdfMargins(0.0))
# 在页面上绘制模板
pdfTemplate.Draw(page, -leftToReduce, -topToReduce)
# 保存新文档
newPdf.SaveToFile("Output/减少PDF页边距.pdf", FileFormat.PDF)
# 释放资源
originalPdf.Dispose()
newPdf.Dispose()

如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。
在 Word 中,书签是一种文档浏览与定位的重要工具,在文档编辑软件中发挥着关键作用。它可以帮助我们快速定位到重要的段落处,从而获取段落内容;它也经常会起到占位符的作用,有了它,我们可以将数据插入到文档中任意的位置。在这篇文章中,我们将探讨如何使用 Spire.Doc for Python 替换或获取 Word 书签内容。
本教程需要 Spire.Doc for Python 和 plum-dispatch v1.7.4。您可以通过以下 pip 命令将它们轻松安装到 Windows 中。
pip install Spire.Doc
如果您不确定如何安装,请参考此教程: 如何在 Windows 中安装 Spire.Doc for Python
用于测试的 Word 源文档如下图:

书签替换内容分为两种,文本和其他内容(如图片、表格或 OfficeMath 公式等其他对象)。首先都需要定位到书签,定位后,文本内容可以使用字符串直接进行替换,其他对象的话则需要添加进 TextBodyPart 对象中再进行替换。这里以表格为例,详细步骤如下:
from spire.doc import *
# 创建Document对象并加载文档
document = Document()
document.LoadFromFile("D:\\schedule\\Data\\模板.docx")
# 创建书签定位器对象并根据书签名字定位书签
bookmarkNavigator_office = BookmarksNavigator(document)
bookmarkNavigator_office.MoveToBookmark("Spire_Office")
# 用文本替换书签,True代表保留格式
bookmarkNavigator_office.ReplaceBookmarkContent(
"Spire.Office for Python 是一个功能强大的综合类库,帮助开发人员使用 Python编程语言处理各种文件格式的文档。"+\
"Spire.Office for Python 包括 Spire.Doc for Python,Spire.XLS for Python,Spire.Presentation for Python 和 Spire.PDF for Python。\n"
"通过使用 Spire.Office for Python,开发人员可以处理 Word (DOC、DOCX)、Excel (XLS、XLSX)、PowerPoint (PPT、PPTX)、PDF "+\
"和其他多种文档格式。该库提供了广泛、高效的文档处理功能,可用于执行文档的读取、创建、编辑和转换等多种任务",
True)
# 创建书签定位器对象并根据书签名字定位书签
bookmarkNavigator_products = BookmarksNavigator(document)
bookmarkNavigator_products.MoveToBookmark("Spire_Products")
# 获取第一个表格
table = document.Sections.get_Item(0).Tables.get_Item(0)
# 创建TextBodyPart对象,并把Table对象添加进去
textBodyPart = TextBodyPart(document)
textBodyPart.BodyItems.Add(table)
# 用textBodyPart替换书签内容,第一个True代表保留第一段的格式,第二个True代表保留替换内容的格式
bookmarkNavigator_products.ReplaceBookmarkContent(textBodyPart, True, True)
# 保存文档
document.SaveToFile("模板_output.docx", FileFormat.Docx)
document.Close()
document.Dispose()

以上例的结果文件测试,获取第一个书签内的文本内容,详细步骤如下:
from spire.doc import *
from io import FileIO
# 创建Document对象,并加载输入文件
doc = Document()
doc.LoadFromFile("模板_output.docx")
# 创建书签导航器,并定位到书签
navigator = BookmarksNavigator(doc)
navigator.MoveToBookmark("Spire_Office")
# 获取书签内容的集合
textBodyPart = navigator.GetBookmarkContent()
text = ''
# 遍历集合中的子对象
for i in range(textBodyPart.BodyItems.Count):
item = textBodyPart.BodyItems.get_Item(i)
# 如果子对象为段落则继续遍历段落子对象集合
if isinstance(item, Paragraph):
for j in range((item if isinstance(item, Paragraph) else
None).ChildObjects.Count):
# 获取段落子对象
childObject = (item if isinstance(item, Paragraph) else
None).ChildObjects.get_Item(j)
# 判断若是Textrange类型,则写入text字符串中
if isinstance(childObject, TextRange):
text += (childObject
if isinstance(childObject, TextRange) else None).Text
# 指定输出文件,并创建文件对象输出text到指定文件
outputFile = "ExtractBookmarkText.txt"
with FileIO(outputFile, mode="w") as f:
f.write(text.encode("utf-8"))
doc.Close()
doc.Dispose()

如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。
Spire.Doc for Java 12.4.14 已发布。本次更新增强了 DOCX 到 PDF 的转换功能,同时修复了 WPS 工具打开保存的新文档内容差异的问题。详情请阅读以下内容。
问题修复:
在 Word 文档中,内容控件是一种特殊的元素,可用于添加交互性和动态内容, 使文档更具交互性和功能性。通过内容控件,用户可以轻松地插入、删除或修改特定部分的内容,而无需改变文档的整体结构, 这样可以更轻松地创建各种类型的文档,提高效率。本文将介绍如何使用 Spire.Doc for Java 在 Java 项目中修改 Word 文档中的内容控件。
首先,您需要在 Java 程序中添加 Spire.Doc.jar 文件作为依赖项。您可以从这个链接下载 JAR 文件;如果您使用 Maven,则可以通过在 pom.xml 文件中添加以下代码导入 JAR 文件。
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.doc</artifactId>
<version>14.9.5</version>
</dependency>
</dependencies>
在 Spire.Doc 中,要修改正文内容控件,需要操作 StructureDocumentTag 对象类型。通过遍历 Section.getBody() 中的子对象集合,找到类型为 StructureDocumentTag 的对象,然后进行相应的更改。以下是详细的步骤:
import com.spire.doc.*;
import com.spire.doc.documents.*;
import java.util.*;
public class ModifyContentControlInBody {
public static void main(String[] args) {
// 创建一个新的文档对象
Document doc = new Document();
// 从文件加载文档内容
doc.loadFromFile("示例1.docx");
// 获取文档正文部分
Body body = doc.getSections().get(0).getBody();
// 创建段落列表和表格列表
List<Paragraph> paragraphs =new ArrayList<>();
List<Table>tables = new ArrayList<>();
for (int i = 0; i < body.getChildObjects().getCount(); i++) {
// 获取文档对象
DocumentObject documentObject = body.getChildObjects().get(i);
// 如果是StructureDocumentTag对象
if (documentObject instanceof StructureDocumentTag) {
StructureDocumentTag structureDocumentTag = (StructureDocumentTag)documentObject;
// 如果标签为"c1"或者别名为"c1"
if (structureDocumentTag.getSDTProperties().getTag().equals("c1") || structureDocumentTag.getSDTProperties().getAlias().equals("c1")) {
for (int j = 0; j < structureDocumentTag.getChildObjects().getCount(); j++) {
// 如果是段落对象
if (structureDocumentTag.getChildObjects().get(j) instanceof Paragraph) {
Paragraph paragraph = (Paragraph)structureDocumentTag.getChildObjects().get(j);
paragraphs.add(paragraph);
}
// 如果是表格对象
if (structureDocumentTag.getChildObjects().get(j) instanceof Table) {
Table table = (Table)structureDocumentTag.getChildObjects().get(j);
tables.add(table);
}
}
}
}
}
// 修改第一个段落的文本内容
paragraphs.get(0).setText("成都冰蓝科技有限公司致力于为开发人员提供 JAVA 组件开发产品。");
// 重置第一个表格的单元格为5行4列
tables.get(0).resetCells(5, 4);
// 将修改后的文档保存到文件
doc.saveToFile("修改Word文档正文中的内容控件.docx", FileFormat.Docx_2016);
// 关闭文档及释放文档资源
doc.close();
doc.dispose();
}
}

在 Spire.Doc 中,要修改段落中的内容控件,需要使用对象类型为 StructureDocumentTagInline。具体操作是遍历段落的子对象集合,找到类型为 StructureDocumentTagInline 的对象,然后对其进行相应的修改。以下是详细的步骤:
import com.spire.doc.*;
import com.spire.doc.documents.*;
import com.spire.doc.fields.*;
public class ModifyContentControlInParagraph {
public static void main(String[] args) {
// 创建一个新的Document对象
Document doc = new Document();
// 从文件加载文档内容
doc.loadFromFile("示例2.docx");
// 获取文档的主体部分
Body body = doc.getSections().get(0).getBody();
// 获取主体部分的第一个段落
Paragraph paragraph = body.getParagraphs().get(0);
// 遍历段落中的子对象
for (int i = 0; i < paragraph.getChildObjects().getCount(); i++) {
// 检查子对象是否为StructureDocumentTagInline类型
if (paragraph.getChildObjects().get(i) instanceof StructureDocumentTagInline) {
// 将子对象转换为StructureDocumentTagInline类型
StructureDocumentTagInline structureDocumentTagInline = (StructureDocumentTagInline)paragraph.getChildObjects().get(i);
// 检查文档标记的Tag或Alias属性是否为"text1"
if (structureDocumentTagInline.getSDTProperties().getTag().equals("text1") || structureDocumentTagInline.getSDTProperties().getAlias().equals("text1")) {
// 遍历StructureDocumentTagInline对象里的子对象
for (int j = 0; j < structureDocumentTagInline.getChildObjects().getCount(); j++) {
// 检查子对象是否为TextRange对象
if (structureDocumentTagInline.getChildObjects().get(j) instanceof TextRange) {
// 将子对象转换为TextRange类型
TextRange range = (TextRange)structureDocumentTagInline.getChildObjects().get(j);
// 设置文本内容为指定内容
range.setText("Word97-2003、Word2007、Word2010、Word2013、Word2016以及Word2019");
}
}
}
// 检查文档标记的Tag或Alias属性是否为"logo1"
if (structureDocumentTagInline.getSDTProperties().getTag().equals("logo1") || structureDocumentTagInline.getSDTProperties().getAlias().equals("logo1")) {
// 遍历StructureDocumentTagInline对象里的子对象
for (int j = 0; j < structureDocumentTagInline.getChildObjects().getCount(); j++) {
// 检查子对象是否为图片
if (structureDocumentTagInline.getChildObjects().get(j) instanceof DocPicture) {
// 将子对象转换为DocPicture类型
DocPicture docPicture = (DocPicture)structureDocumentTagInline.getChildObjects().get(j);
// 加载指定图片
docPicture.loadImage("https://cdn.e-iceblue.cn/Doc-Java.png");
// 设置图片宽度和高度
docPicture.setWidth(100);
docPicture.setHeight(100);
}
}
}
}
}
// 将修改后的文档保存为新的文件
doc.saveToFile("修改Word文档的段落中的内容控件.docx", FileFormat.Docx_2016);
// 关闭文档及释放文档资源
doc.close();
doc.dispose();
}
}

在 Spire.Doc 中,要修改表格行内容控件,需要遍历表格的子对象集合,找到类型为 StructureDocumentTagRow 的对象,然后进行相应的更改。以下是详细的步骤:
import com.spire.doc.*;
import com.spire.doc.documents.*;
import com.spire.doc.fields.*;
import java.awt.*;
public class ModifyTextContentControlInTableRow {
public static void main(String[] args) {
// 创建一个新的文档对象
Document doc = new Document();
// 从文件加载文档
doc.loadFromFile("示例3.docx");
// 获取文档正文部分
Body body = doc.getSections().get(0).getBody();
// 获取第一个表格
Table table = body.getTables().get(0);
// 遍历表格中的子对象
for (int i = 0; i < table.getChildObjects().getCount(); i++) {
// 判断子对象是否为StructureDocumentTagRow类型
if (table.getChildObjects().get(i) instanceof StructureDocumentTagRow) {
// 将子对象转换为StructureDocumentTagRow对象
StructureDocumentTagRow structureDocumentTagRow = (StructureDocumentTagRow)table.getChildObjects().get(i);
// 检查StructureDocumentTagRow的Tag或Alias属性是否为"row1"
if (structureDocumentTagRow.getSDTProperties().getTag().equals("row1") || structureDocumentTagRow.getSDTProperties().getAlias().equals("row1")) {
// 清空单元格中的段落
structureDocumentTagRow.getCells().get(0).getParagraphs().clear();
// 在单元格中添加一个段落,并设置文本
TextRange textRange = structureDocumentTagRow.getCells().get(0).addParagraph().appendText("艺术");
textRange.getCharacterFormat().setTextColor(Color.BLUE);
}
}
}
// 将修改后的文档保存到文件
doc.saveToFile("修改表格行内容控件.docx", FileFormat.Docx_2016);
// 关闭文档及释放文档资源
doc.close();
doc.dispose();
}
}

在 Spire.Doc 中,要对表格单元格的内容控件对象进行操作,需要使用名为 StructureDocumentTagCell 的特定类型的对象。这可以通过检查 TableRow.getChildObjects() 中的子对象集合,找到类型为 StructureDocumentTagCell 的对象,然后执行相应的操作。以下是详细的步骤:
import com.spire.doc.*;
import com.spire.doc.documents.*;
import com.spire.doc.fields.*;
import java.awt.*;
public class ModifyTextContentControlInTableCell {
public static void main(String[] args) {
// 创建一个新的文档对象
Document doc = new Document();
// 从文件加载文档
doc.loadFromFile("示例4.docx");
// 获取文档的正文部分
Body body = doc.getSections().get(0).getBody();
// 获取文档中的第一个表格
Table table = body.getTables().get(0);
// 遍历表格的行
for (int i = 0; i < table.getRows().getCount(); i++) {
// 遍历每行中的子对象
for (int j = 0; j < table.getRows().get(i).getChildObjects().getCount(); j++) {
// 检查该子对象是否为StructureDocumentTagCell
if (table.getRows().get(i).getChildObjects().get(j) instanceof StructureDocumentTagCell)
{
// 将子对象转换为StructureDocumentTagCell类型
StructureDocumentTagCell structureDocumentTagCell = (StructureDocumentTagCell)table.getRows().get(i).getChildObjects().get(j);
// 检查structureDocumentTagCell的Tag或Alias属性是否为"cell1"
if (structureDocumentTagCell.getSDTProperties().getTag().equals("cell1") || structureDocumentTagCell.getSDTProperties().getAlias().equals("cell1")) {
// 清空单元格中的段落
structureDocumentTagCell.getParagraphs().clear();
// 添加一个新段落,并在其中添加文本
TextRange textRange = structureDocumentTagCell.addParagraph().appendText("92");
textRange.getCharacterFormat().setTextColor(Color.BLUE);
}
}
}
}
// 将修改后的文档保存为新的文件
doc.saveToFile("修改表格单元格内容控件.docx", FileFormat.Docx_2016);
// 关闭文档及释放文档资源
doc.close();
doc.dispose();
}
}

这个案例演示了如何修改表格单元格中段落的内容控件。首先要访问单元格中的段落集合 TableCell.getParagraphs(),然后遍历每个段落对象的子对象集合 Paragraph.getChildObjects(),在其中查找类型为 StructureDocumentTagInline 的对象,最后对其进行修改。以下是详细的步骤:
import com.spire.doc.*;
import com.spire.doc.documents.*;
import com.spire.doc.fields.TextRange;
import java.awt.*;
public class ModifyTextContentControlInParagraphOfTableCell {
public static void main(String[] args) {
// 创建一个新的Document对象
Document doc = new Document();
// 从文件加载文档内容
doc.loadFromFile("示例5.docx");
// 获取文档正文部分
Body body = doc.getSections().get(0).getBody();
// 获取第一个表格
Table table = body.getTables().get(0);
// 遍历表格的行
for (int r = 0; r < table.getRows().getCount(); r++) {
// 遍历表格行中的单元格
for (int c = 0; c < table.getRows().get(r).getCells().getCount(); c++) {
// 遍历单元格中的段落
for (int p = 0; p < table.getRows().get(r).getCells().get(c).getParagraphs().getCount(); p++) {
// 获取段落对象
Paragraph paragraph = table.getRows().get(r).getCells().get(c).getParagraphs().get(p);
// 遍历段落中的子对象
for (int i = 0; i < paragraph.getChildObjects().getCount(); i++) {
// 判断子对象是否为StructureDocumentTagInline类型
if (paragraph.getChildObjects().get(i) instanceof StructureDocumentTagInline) {
// 转换为StructureDocumentTagInline对象
StructureDocumentTagInline structureDocumentTagInline = (StructureDocumentTagInline)paragraph.getChildObjects().get(i);
// 检查StructureDocumentTagInline的Tag或Alias属性是否为"test1"
if (structureDocumentTagInline.getSDTProperties().getTag().equals("test1") || structureDocumentTagInline.getSDTProperties().getAlias().equals("test1") ) {
// 遍历StructureDocumentTagInline的子对象
for (int j = 0; j < structureDocumentTagInline.getChildObjects().getCount(); j++) {
// 判断子对象是否为TextRange类型
if (structureDocumentTagInline.getChildObjects().get(j) instanceof TextRange) {
// 转换为TextRange对象
TextRange textRange = (TextRange)structureDocumentTagInline.getChildObjects().get(j);
// 设置文本内容
textRange.setText("89");
//设置文本颜色
textRange.getCharacterFormat().setTextColor(Color.BLUE);
}
}
}
}
}
}
}
}
// 将修改后的文档保存为新文件
doc.saveToFile("修改表格单元格的段落中的文本内容控件.docx", FileFormat.Docx_2016);
// 关闭文档及释放文档资源
doc.close();
doc.dispose();
}
}

如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。
Spire.PDF for Java 10.4.9 现已正式发布。该版本支持获取 PDF 文档中的 Javascript 内容,并新增了一个构造方法来解决 PdfInkAnnotation 在浏览器里没有显示的问题。此外,在提取 PDF 表格和扁平化表单域时遇到的两个问题也已成功被修复。详情请查阅以下内容。
新功能:
PdfDocument doc = new PdfDocument();
PdfPageBase pdfPage = doc.getPages().add();
ArrayList inkList = new ArrayList();
int[] intPoints = new int[]
{
100,800,
200,800,
200,700
};
inkList.add(intPoints);
Rectangle2D rect = new Rectangle2D.Float();
rect.setFrame(new Point2D.Float(0, 0), new Dimension((int)pdfPage.getActualSize().getWidth(), (int)pdfPage.getActualSize().getHeight()));
PdfInkAnnotation ink= new PdfInkAnnotation(rect,inkList);
ink.setColor(new PdfRGBColor(Color.RED));
ink.getBorder().setWidth(12);
ink.setText("e-iceblue");
pdfPage.getAnnotations().add(ink);
doc.saveToFile("inkAnnotation.pdf");PdfPageBase page = pdf.getPages().get(0);
StringBuilder stringBuilder = new StringBuilder();
java.util.List<PdfJavaScriptAction> list = pdf.getNames().getJavaScripts();
stringBuilder.append(list.get(2).getScript()+"\r\n");
list.get(0).setScript("new javaScript code");
PdfAnnotationCollection annotationCollection = page.getAnnotations();
for(int i = 0;i < annotationCollection.getCount();i++){
PdfLinkAnnotationWidget annotation = (PdfLinkAnnotationWidget) annotationCollection.get(i);
stringBuilder.append("Method name:"+"\r\n");
String script = ((PdfJavaScriptAction) annotation.getAction()).getScript();
stringBuilder.append(script+"\r\n");
}问题修复:
Spire.XLS for Python 14.4.4 已发布。本次更新新增支持对 CellRange 添加 FindAll() 方法。此外,一些已知问题也在该版本中成功修复,如获取自定义字体文件失败的问题。详情请阅读以下内容。
新功能:
workbook = Workbook()
workbook.LoadFromFile("test.xlsx")
sheet = workbook.Worksheets[0]
sheet.Range["A1"].FindAll("Hello",FindType.Text, ExcelFindOptions.MatchEntireCellContent)问题修复: