很高兴通知大家 Spire.Office for Java 11.3.0 现已发布。在本次更新中,Spire.Doc for Java 支持设置“为字体调整字间距”功能; Spire.PDF for Java 支持 PDF 2.0 格式;Spire.XLS for Java 增强了 Excel 到 PDF 的转换稳定性; Spire.Presentation for Java支持将 PPTX 保存为视频格式。另外,大量已知问题得到修复。更多详细信息如下。
https://www.e-iceblue.cn/Downloads/Spire-Office-JAVA.html
新功能:
paragraph.Format.AdjustRightIndent =true;//默认值是true
textRange.CharacterFormat.Kerning =2.5f;
HtmlExportOptions options = document.getHtmlExportOptions();
options.setOfficeMathOutputMode(HtmlOfficeMathOutputMode.Math_ML);
问题修复:
问题修复:
新功能:
doc.getFileInfo().setVersion(PdfVersion.Version_2_0);
问题修复:
新功能:
String inputFile = "input.pptx";
String outputFile = "output.mp4";
Presentation presentation = new Presentation();
presentation.loadFromFile(inputFile);
SaveToVideoOption saveOption = new SaveToVideoOption.Builder("D:\tools\ffmpeg-7.1.1-essentials_build\bin") // 设置 ffmpeg 路径
.setFps() // 帧率
.setThreadsCount() // 线程数
.setDurationForEachSlide() // 每张幻灯片的持续时间
.build();
presentation.setSaveToVideoOption(saveOption);
presentation.saveToFile(outputFile, FileFormat.AUTO);
我们很高兴地宣布,Spire.Office 11.3.0 正式发布。在此版本中,新增支持将 Word 转换为 Excel,以及添加和操作 SmartArt 图形;Spire.XLS 新增对 VBA 宏项目的操作支持;Spire.PDFViewer 现已支持基于 .NET 6.0 的 WPF 和 WinForms 应用程序。此外,本版本还修复了大量已知问题。
本次发布集成了以下组件的最新版本:Spire.Doc、Spire.PDF、Spire.XLS、Spire.Presentation、Spire.Barcode、Spire.DocViewer、Spire.PDFViewer、Spire.Email、Spire.Spreadsheet 和 Spire.OfficeViewer。
https://www.e-iceblue.cn/Downloads/Spire-Office-NET.html
新功能:
paragraph.Format.AdjustRightIndent =true;//默认值是true
textRange.CharacterFormat.Kerning = 2.5f;
Document document = new Document();
Section section = document.AddSection();
Spire.Doc.Documents.Paragraph paragraph = section.AddParagraph(); paragraph.Format.HorizontalAlignment = HorizontalAlignment.Center;
Spire.Doc.Fields.TextRange textRange = paragraph.AppendText("RepeatingBendingProcess");
textRange.CharacterFormat.FontSize = 28f;
textRange.CharacterFormat.FontName = "Times New Roman";
paragraph = section.AddParagraph();
paragraph = section.AddParagraph();
paragraph.Format.HorizontalAlignment = HorizontalAlignment.Center;
// 添加采用“分段流程”版式的SmartArt图形
Spire.Doc.Fields.Shapes.Shape shape = paragraph.AppendSmartArt(SmartArtType.RepeatingBendingProcess, 432, 252);
SmartArt repeatingBendingSmartArt = shape.SmartArt;
// 添加节点文本
SmartArtNode process1 = repeatingBendingSmartArt.Nodes[0];
process1.Text = "1";
((Spire.Doc.Fields.TextRange)process1.Paragraphs[0].ChildObjects[0]).CharacterFormat.FontName = "Calibri";
((Spire.Doc.Fields.TextRange)process1.Paragraphs[0].ChildObjects[0]).CharacterFormat.FontSize = 20f;
((Spire.Doc.Fields.TextRange)process1.Paragraphs[0].ChildObjects[0]).CharacterFormat.TextColor = Color.Crimson;
// 添加节点文本
SmartArtNode process2 = repeatingBendingSmartArt.Nodes[1];
process2.Text = "2";
((Spire.Doc.Fields.TextRange)process2.Paragraphs[0].ChildObjects[0]).CharacterFormat.FontSize = 15f;
// 添加节点文本
SmartArtNode process3 = repeatingBendingSmartArt.Nodes[2];
process3.Text = "3";
((Spire.Doc.Fields.TextRange)process3.Paragraphs[0].ChildObjects[0]).CharacterFormat.FontSize = 10f;
// 添加节点文本
SmartArtNode process4 = repeatingBendingSmartArt.Nodes[3];
process4.Text = "4";
((Spire.Doc.Fields.TextRange)process4.Paragraphs[0].ChildObjects[0]).CharacterFormat.FontSize = 10f;
// 添加节点文本
SmartArtNode process5 = repeatingBendingSmartArt.Nodes[4];
process5.Text = "5";
((Spire.Doc.Fields.TextRange)process5.Paragraphs[0].ChildObjects[0]).CharacterFormat.FontSize = 10f;
document.SaveToFile(outputFile, FileFormat.Docx);
document.Close();
using (Document document = new Document(inputFile))
{
// 遍历所有节
foreach (Section section in document.Sections)
{
if (section?.Paragraphs == null) continue;
// 遍历节内所有段落
foreach (Spire.Doc.Documents.Paragraph paragraph in section.Paragraphs)
{
foreach (var childObj in paragraph.ChildObjects)
{
if (childObj is Spire.Doc.Fields.Shapes.Shape shape && shape.HasSmartArt)
{
SmartArt smartArt = shape.SmartArt;
if (smartArt == null) continue;
TraverseSmartArtNodes(smartArt.Nodes, builder, 0);
}
}
}
}
}
public static void TraverseSmartArtNodes(SmartArtNodeCollection nodes, StringBuilder builder, int level)
{
if (nodes == null || nodes.Count == 0) return;
for (int nodeIdx = 0; nodeIdx < nodes.Count; nodeIdx++)
{
SmartArtNode node = nodes[nodeIdx];
if (node == null) continue;
// 清理节点文本
string nodeText = node.Text != null ? node.Text.Trim() : "空文本";
if (nodeText == "\r" || string.IsNullOrEmpty(nodeText)) continue;
// 拼接节点层级标识
string nodePrefix;
switch (level)
{
case 0:
nodePrefix = "smartArt.Nodes";
break;
case 1:
nodePrefix = "smartArt.Nodes.ChildNodes";
break;
case 2:
nodePrefix = "smartArt.Nodes.ChildNodes.ChildNodes";
break;
default:
nodePrefix = $"smartArt.Nodes.Level{level}";
break;
}
// 基础文本输出
builder.AppendLine($"{nodePrefix}_{nodeIdx}:{nodeText}");
// 递归处理子节点
TraverseSmartArtNodes(node.ChildNodes, builder, level + 1);
}
}
Document.SaveToFile("output.xlsx", FileFormat.XLSX);
调整:
问题修复:
新功能:
Workbook workbook = new Workbook();
// 添加VBA工程到文档
IVbaProject vbaProject = workbook.VbaProject;
vbaProject.Name = "SampleVBAMacro";
string text = "修改前编码:" + vbaProject.CodePage.ToString() + "\n";
vbaProject.CodePage = 936; //设置编码,支持中文
text += "修改后编码:" + vbaProject.CodePage.ToString() + "\n";
File.WriteAllText(outputFile_TXT, text);
// 将 VBA 模块添加到项目中
IVbaModule vbaModule = vbaProject.Modules.Add("SampleModule", VbaModuleType.Module);
// 设置 VBA 宏源代码
vbaModule.SourceCode = @"
Sub ExampleMacro()
' 声明变量
Dim ws As Worksheet
Dim i As Integer
' 设置引用到活动工作表
Set ws = ActiveSheet
' 清除工作表内容(可选)
ws.Cells.Clear
' 填充示例数据
With ws
' 写入标题行
.Range(""A1:C1"").Value = Array(""序号"", ""项目名称"", ""金额"")
' 循环填充10行数据
For i = 1 To 10
.Cells(i + 1, 1).Value = i ' 序号列
.Cells(i + 1, 2).Value = ""Project "" & i ' 项目名称列
.Cells(i + 1, 3).Value = i * 100 ' 金额列(示例计算)
Next i
' 自动调整列宽
.Columns(""A:C"").AutoFit
' 格式化标题行
With .Range(""A1:C1"")
.Font.Bold = True
.Interior.Color = RGB(200, 220, 255) ' 浅蓝色背景
End With
' 格式化金额列
.Range(""C2:C11"").NumberFormat = ""$#,##0.00""
End With
' 显示完成消息
MsgBox ""数据填充完成!"", vbInformation, ""操作提示""
End Sub";
// Save the Excel file
workbook.SaveToFile(outputFile_Xls, FileFormat.Version97to2003);
Workbook wb = new Workbook();
wb.LoadFromFile(inputFile);
Worksheet ws = wb.Worksheets[0];
IVbaProject vbaProject = wb.VbaProject;
string text = "是否加密保护:" + vbaProject.IsProtected + "\n";
text += "名称:" + vbaProject.Name + "\n";
text += "描述:" + vbaProject.Description + "\n";
text += "帮助文件名称:" + vbaProject.HelpFileName + "\n";
text += "条件编译参数:" + vbaProject.ConditionalCompilation + "\n";
text += "是否锁定工程查看:" + vbaProject.LockProjectView + "\n";
text += "密码:" + vbaProject.Password + "\n";
text += "代码页:" + vbaProject.CodePage + "\n";
IVbaModule mod = vbaProject.Modules.GetWorksheetModule(ws);
text += "VBA 模块接口:" + "\n";
text += "模块名称:" + mod.Name.ToString() + "\n";
text += "源代码:\n" + mod.SourceCode.ToString() + "\n";
text += "模块类型:" + mod.Type.ToString() + "\n";
File.WriteAllText(outputFile_TXT, text.ToString());
vbaProject.Modules.Clear();
wb.SaveToFile(outputFile);
Workbook wb = new Workbook();
wb.LoadFromFile(inputFile);
Worksheet ws = wb.Worksheets[0];
IVbaProject vbaProject = wb.VbaProject;
vbaProject.Password = "1234";
vbaProject.Name = "modify";
vbaProject.Description = "Description";
vbaProject.HelpFileName = "image1.png";
vbaProject.ConditionalCompilation = "DEBUG = 2";
vbaProject.LockProjectView = true;
IVbaModule mod = vbaProject.Modules.GetWorksheetModule(ws);
mod.Name = "IVbaModule";
mod.SourceCode = "Dim lRow As Long";
mod.Type = VbaModuleType.Module;
wb.SaveToFile(outputFile);
Workbook wb1 = new Workbook();
wb1.LoadFromFile(inputFile_1);
IVbaProject vbaProject1 = wb1.VbaProject;
vbaProject1.Modules.Remove("SampleModule");
vbaProject1.Modules.RemoveAt(0);
wb1.SaveToFile(outputFile_1);
Workbook wb = new Workbook();
wb.LoadFromFile(inputFile);
Worksheet worksheet = wb.Worksheets[0];
// 访问工作表中的情景集合
XlsScenarioCollection scenarios = worksheet.Scenarios;
// 为情景初始化存储不同数值的列表对象
List<object> currentChangePercentage_Values = new List<object> { 0.23, 0.8, 1.1, 0.5, 0.35, 0.2 };
List<object> increasedChangePercentage_Values = new List<object> { 0.45, 0.56, 0.9, 0.5, 0.58, 0.43 };
List<object> decreasedChangePercentage_Values = new List<object> { 0.3, 0.2, 0.5, 0.3, 0.5, 0.23 };
List<object> currentQuantity_Values = new List<object> { 1500, 3000, 5000, 4000, 500, 4000 };
List<object> increasedQuantity_Values = new List<object> { 1000, 5000, 4500, 3900, 10000, 8900 };
List<object> decreasedQuantity_Values = new List<object> { 1000, 2000, 3000, 3000, 300, 4000 };
// 在工作表中,为同一组单元格添加携带不同数值的情景
scenarios.Add("Current % of Change", worksheet.Range["F5:F10"], currentChangePercentage_Values);
scenarios.Add("Increased % of Change", worksheet.Range["F5:F10"], increasedChangePercentage_Values);
scenarios.Add("Decreased % of Change", worksheet.Range["F5:F10"], decreasedChangePercentage_Values);
scenarios.Add("Current Quantity", worksheet.Range["D5:D10"], currentQuantity_Values);
scenarios.Add("Increased Quantity", worksheet.Range["D5:D10"], increasedQuantity_Values);
scenarios.Add("Decreased Quantity", worksheet.Range["D5:D10"], decreasedQuantity_Values);
// 保存工作簿
wb.SaveToFile(outputFile, ExcelVersion.Version2013);
wb.Dispose();
Workbook wb = new Workbook();
wb.LoadFromFile(inputFile);
Worksheet worksheet = wb.Worksheets[0];
// 访问工作表中的情景集合
XlsScenarioCollection scenarios = worksheet.Scenarios;
// 为情景初始化存储不同数值的列表对象
List<object> currentChangePercentage_Values = new List<object>{ 0.23, 0.8, 1.1, 0.5, 0.35, 0.2 };
List<object> increasedChangePercentage_Values = new List<object> { 0.45, 0.56, 0.9, 0.5, 0.58, 0.43 };
List<object> decreasedChangePercentage_Values = new List<object> { 0.3, 0.2, 0.5, 0.3, 0.5, 0.23 };
List<object> currentQuantity_Values = new List<object> { 1500, 3000, 5000, 4000, 500, 4000 };
List<object> increasedQuantity_Values = new List<object> { 1000, 5000, 4500, 3900, 10000, 8900 };
List<object> decreasedQuantity_Values = new List<object> { 1000, 2000, 3000, 3000, 300, 4000 };
// 在工作表中,为同一组单元格添加携带不同数值的情景
scenarios.Add("Current % of Change", worksheet.Range["F5:F10"], currentChangePercentage_Values);
scenarios.Add("Increased % of Change", worksheet.Range["F5:F10"], increasedChangePercentage_Values);
scenarios.Add("Decreased % of Change", worksheet.Range["F5:F10"], decreasedChangePercentage_Values);
scenarios.Add("Current Quantity", worksheet.Range["D5:D10"], currentQuantity_Values);
scenarios.Add("Increased Quantity", worksheet.Range["D5:D10"], increasedQuantity_Values);
scenarios.Add("Decreased Quantity", worksheet.Range["D5:D10"], decreasedQuantity_Values);
// 创建摘要汇总
worksheet.Scenarios.Summary(worksheet.Range["L7"]);
// 保存工作簿
wb.SaveToFile(outputFile, ExcelVersion.Version2013);
wb.Dispose();
Workbook wb = new Workbook();
wb.LoadFromFile(inputFile);
Worksheet worksheet = wb.Worksheets[0];
// 访问工作表中的情景集合
XlsScenarioCollection scenarios = worksheet.Scenarios;
XlsScenario scenario1 = scenarios[0];
XlsScenario scenario2 = scenarios[1];
// 修改情景方案
scenario1.SetVariableCells(worksheet.Range["A1:A5"], scenario2.Values);
CellRange sourceCell = worksheet.Range["B1:B5"];
scenario2.SetVariableCells(sourceCell, scenario2.Values);
scenario1.Show();
scenario2.Show();
// 保存工作簿
wb.SaveToFile(outputFile, ExcelVersion.Version2013);
wb.Dispose();
Workbook wb = new Workbook();
wb.LoadFromFile(inputFile);
Worksheet worksheet1 = wb.Worksheets[0];
Worksheet worksheet2 = wb.Worksheets[1];
// 合并情景方案
worksheet1.Scenarios.Merge(worksheet2);
// 保存工作簿
wb.SaveToFile(outputFile, ExcelVersion.Version2013);
wb.Dispose();
Workbook wb = new Workbook();
wb.LoadFromFile(inputFile);
Worksheet worksheet = wb.Worksheets[0];
// 访问工作表中的情景集合
XlsScenarioCollection scenarios = worksheet.Scenarios;
// 删除情景方案
scenarios.RemoveScenarioAt(0);
scenarios.RemoveScenarioByName("two");
string content = "";
content += "Count:" + scenarios.Count + "\n";
content += "ContainsScenario:" + scenarios.ContainsScenario("two").ToString() + "\n";
content += "ContainsScenario:" + scenarios.ContainsScenario("one").ToString() + "\n";
File.WriteAllText(outputFile, content.ToString());
// 保存工作簿
wb.SaveToFile(outputFile, ExcelVersion.Version2013);
wb.Dispose();
问题修复:
问题修复:
问题修复:
新功能:
Spire.PDF for Java 12.3.9 现已正式发布。该版本增强了从 PDF 到 PDF/A 的转换功能。同时,一些在合并 PDF 文档以及释放资源时出现的问题也得以成功修复。更多详情如下。
问题修复:
Spire.XLS 16.3.6 现已发布。该版本支持操作 VBA 宏工程并新增了对数据模拟分析功能的支持。此外,还修复了复制工作表时宏丢失的问题。详情如下。
新功能:
Workbook workbook = new Workbook();
// 添加VBA工程到文档
IVbaProject vbaProject = workbook.VbaProject;
vbaProject.Name = "SampleVBAMacro";
string text = "修改前编码:" + vbaProject.CodePage.ToString() + "\n";
vbaProject.CodePage = 936; //设置编码,支持中文
text += "修改后编码:" + vbaProject.CodePage.ToString() + "\n";
File.WriteAllText(outputFile_TXT, text);
// 将 VBA 模块添加到项目中
IVbaModule vbaModule = vbaProject.Modules.Add("SampleModule", VbaModuleType.Module);
// 设置 VBA 宏源代码
vbaModule.SourceCode = @"
Sub ExampleMacro()
' 声明变量
Dim ws As Worksheet
Dim i As Integer
' 设置引用到活动工作表
Set ws = ActiveSheet
' 清除工作表内容(可选)
ws.Cells.Clear
' 填充示例数据
With ws
' 写入标题行
.Range(""A1:C1"").Value = Array(""序号"", ""项目名称"", ""金额"")
' 循环填充10行数据
For i = 1 To 10
.Cells(i + 1, 1).Value = i ' 序号列
.Cells(i + 1, 2).Value = ""Project "" & i ' 项目名称列
.Cells(i + 1, 3).Value = i * 100 ' 金额列(示例计算)
Next i
' 自动调整列宽
.Columns(""A:C"").AutoFit
' 格式化标题行
With .Range(""A1:C1"")
.Font.Bold = True
.Interior.Color = RGB(200, 220, 255) ' 浅蓝色背景
End With
' 格式化金额列
.Range(""C2:C11"").NumberFormat = ""$#,##0.00""
End With
' 显示完成消息
MsgBox ""数据填充完成!"", vbInformation, ""操作提示""
End Sub";
// Save the Excel file
workbook.SaveToFile(outputFile_Xls, FileFormat.Version97to2003);
Workbook wb = new Workbook();
wb.LoadFromFile(inputFile);
Worksheet ws = wb.Worksheets[0];
IVbaProject vbaProject = wb.VbaProject;
string text = "是否加密保护:" + vbaProject.IsProtected + "\n";
text += "名称:" + vbaProject.Name + "\n";
text += "描述:" + vbaProject.Description + "\n";
text += "帮助文件名称:" + vbaProject.HelpFileName + "\n";
text += "条件编译参数:" + vbaProject.ConditionalCompilation + "\n";
text += "是否锁定工程查看:" + vbaProject.LockProjectView + "\n";
text += "密码:" + vbaProject.Password + "\n";
text += "代码页:" + vbaProject.CodePage + "\n";
IVbaModule mod = vbaProject.Modules.GetWorksheetModule(ws);
text += "VBA 模块接口:" + "\n";
text += "模块名称:" + mod.Name.ToString() + "\n";
text += "源代码:\n" + mod.SourceCode.ToString() + "\n";
text += "模块类型:" + mod.Type.ToString() + "\n";
File.WriteAllText(outputFile_TXT, text.ToString());
vbaProject.Modules.Clear();
wb.SaveToFile(outputFile);
Workbook wb = new Workbook();
wb.LoadFromFile(inputFile);
Worksheet ws = wb.Worksheets[0];
IVbaProject vbaProject = wb.VbaProject;
vbaProject.Password = "1234";
vbaProject.Name = "modify";
vbaProject.Description = "Description";
vbaProject.HelpFileName = "image1.png";
vbaProject.ConditionalCompilation = "DEBUG = 2";
vbaProject.LockProjectView = true;
IVbaModule mod = vbaProject.Modules.GetWorksheetModule(ws);
mod.Name = "IVbaModule";
mod.SourceCode = "Dim lRow As Long";
mod.Type = VbaModuleType.Module;
wb.SaveToFile(outputFile);
Workbook wb1 = new Workbook();
wb1.LoadFromFile(inputFile_1);
IVbaProject vbaProject1 = wb1.VbaProject;
vbaProject1.Modules.Remove("SampleModule");
vbaProject1.Modules.RemoveAt(0);
wb1.SaveToFile(outputFile_1);
Workbook wb = new Workbook();
wb.LoadFromFile(inputFile);
Worksheet worksheet = wb.Worksheets[0];
// 访问工作表中的情景集合
XlsScenarioCollection scenarios = worksheet.Scenarios;
// 为情景初始化存储不同数值的列表对象
List<object> currentChangePercentage_Values = new List<object> { 0.23, 0.8, 1.1, 0.5, 0.35, 0.2 };
List<object> increasedChangePercentage_Values = new List<object> { 0.45, 0.56, 0.9, 0.5, 0.58, 0.43 };
List<object> decreasedChangePercentage_Values = new List<object> { 0.3, 0.2, 0.5, 0.3, 0.5, 0.23 };
List<object> currentQuantity_Values = new List<object> { 1500, 3000, 5000, 4000, 500, 4000 };
List<object> increasedQuantity_Values = new List<object> { 1000, 5000, 4500, 3900, 10000, 8900 };
List<object> decreasedQuantity_Values = new List<object> { 1000, 2000, 3000, 3000, 300, 4000 };
// 在工作表中,为同一组单元格添加携带不同数值的情景
scenarios.Add("Current % of Change", worksheet.Range["F5:F10"], currentChangePercentage_Values);
scenarios.Add("Increased % of Change", worksheet.Range["F5:F10"], increasedChangePercentage_Values);
scenarios.Add("Decreased % of Change", worksheet.Range["F5:F10"], decreasedChangePercentage_Values);
scenarios.Add("Current Quantity", worksheet.Range["D5:D10"], currentQuantity_Values);
scenarios.Add("Increased Quantity", worksheet.Range["D5:D10"], increasedQuantity_Values);
scenarios.Add("Decreased Quantity", worksheet.Range["D5:D10"], decreasedQuantity_Values);
// 保存工作簿
wb.SaveToFile(outputFile, ExcelVersion.Version2013);
wb.Dispose();
Workbook wb = new Workbook();
wb.LoadFromFile(inputFile);
Worksheet worksheet = wb.Worksheets[0];
// 访问工作表中的情景集合
XlsScenarioCollection scenarios = worksheet.Scenarios;
// 为情景初始化存储不同数值的列表对象
List<object> currentChangePercentage_Values = new List<object>{ 0.23, 0.8, 1.1, 0.5, 0.35, 0.2 };
List<object> increasedChangePercentage_Values = new List<object> { 0.45, 0.56, 0.9, 0.5, 0.58, 0.43 };
List<object> decreasedChangePercentage_Values = new List<object> { 0.3, 0.2, 0.5, 0.3, 0.5, 0.23 };
List<object> currentQuantity_Values = new List<object> { 1500, 3000, 5000, 4000, 500, 4000 };
List<object> increasedQuantity_Values = new List<object> { 1000, 5000, 4500, 3900, 10000, 8900 };
List<object> decreasedQuantity_Values = new List<object> { 1000, 2000, 3000, 3000, 300, 4000 };
// 在工作表中,为同一组单元格添加携带不同数值的情景
scenarios.Add("Current % of Change", worksheet.Range["F5:F10"], currentChangePercentage_Values);
scenarios.Add("Increased % of Change", worksheet.Range["F5:F10"], increasedChangePercentage_Values);
scenarios.Add("Decreased % of Change", worksheet.Range["F5:F10"], decreasedChangePercentage_Values);
scenarios.Add("Current Quantity", worksheet.Range["D5:D10"], currentQuantity_Values);
scenarios.Add("Increased Quantity", worksheet.Range["D5:D10"], increasedQuantity_Values);
scenarios.Add("Decreased Quantity", worksheet.Range["D5:D10"], decreasedQuantity_Values);
// 创建摘要汇总
worksheet.Scenarios.Summary(worksheet.Range["L7"]);
// 保存工作簿
wb.SaveToFile(outputFile, ExcelVersion.Version2013);
wb.Dispose();
Workbook wb = new Workbook();
wb.LoadFromFile(inputFile);
Worksheet worksheet = wb.Worksheets[0];
// 访问工作表中的情景集合
XlsScenarioCollection scenarios = worksheet.Scenarios;
XlsScenario scenario1 = scenarios[0];
XlsScenario scenario2 = scenarios[1];
// 修改情景方案
scenario1.SetVariableCells(worksheet.Range["A1:A5"], scenario2.Values);
CellRange sourceCell = worksheet.Range["B1:B5"];
scenario2.SetVariableCells(sourceCell, scenario2.Values);
scenario1.Show();
scenario2.Show();
// 保存工作簿
wb.SaveToFile(outputFile, ExcelVersion.Version2013);
wb.Dispose();
Workbook wb = new Workbook();
wb.LoadFromFile(inputFile);
Worksheet worksheet1 = wb.Worksheets[0];
Worksheet worksheet2 = wb.Worksheets[1];
// 合并情景方案
worksheet1.Scenarios.Merge(worksheet2);
// 保存工作簿
wb.SaveToFile(outputFile, ExcelVersion.Version2013);
wb.Dispose();
Workbook wb = new Workbook();
wb.LoadFromFile(inputFile);
Worksheet worksheet = wb.Worksheets[0];
// 访问工作表中的情景集合
XlsScenarioCollection scenarios = worksheet.Scenarios;
// 删除情景方案
scenarios.RemoveScenarioAt(0);
scenarios.RemoveScenarioByName("two");
string content = "";
content += "Count:" + scenarios.Count + "\n";
content += "ContainsScenario:" + scenarios.ContainsScenario("two").ToString() + "\n";
content += "ContainsScenario:" + scenarios.ContainsScenario("one").ToString() + "\n";
File.WriteAllText(outputFile, content.ToString());
// 保存工作簿
wb.SaveToFile(outputFile, ExcelVersion.Version2013);
wb.Dispose();
问题修复:
我们很高兴地宣布发布 Spire.Presentation for Java 11.3.5。本次更新新增了将 PPTX 文件保存为视频格式(如 MP4 和 WMV)的功能。详情如下。
新功能:
String inputFile = "input.pptx";
String outputFile = "output.mp4";
Presentation presentation = new Presentation();
presentation.loadFromFile(inputFile);
SaveToVideoOption saveOption = new SaveToVideoOption.Builder("D:\tools\ffmpeg-7.1.1-essentials_build\bin") // 设置 ffmpeg 路径
.setFps() // 帧率
.setThreadsCount() // 线程数
.setDurationForEachSlide() // 每张幻灯片的持续时间
.build();
presentation.setSaveToVideoOption(saveOption);
presentation.saveToFile(outputFile, FileFormat.AUTO);
https://www.e-iceblue.cn/Downloads/Spire-Presentation-JAVA.html
Spire.Doc for Java 14.3.5 现已正式发布。该版本支持在转换 Word 到 HTML 时,配置转换公式到 MathML。同时,一些在加载 Word 文档、转换 Word 到 PDF 以及操作 OLE 对象时出现的问题也得以成功修复。更多详情如下。
新功能:
HtmlExportOptions options = document.getHtmlExportOptions();
options.setOfficeMathOutputMode(HtmlOfficeMathOutputMode.Math_ML);
问题修复:
Spire.XLS for Java 16.3.2 现已正式发布。该版本增强了 Excel 转 PDF 的转换功能,同时修复了一些问题,例如加载文档时程序挂起的问题。更多详情如下。
问题修复:
我们很高兴地宣布发布 Spire.Presentation for Python 11.3.0。本次更新修复了 PowerPoint 转换为图像时的一个问题,提高了转换的稳定性和输出质量。更多详情如下。
问题修复:
https://www.e-iceblue.cn/Downloads/Spire-Presentation-Python.html

在 Python 中导入 Excel 文件,通常不仅仅是“读取文件”这么简单。在大多数实际场景中,我们需要将 Excel 数据转换为 Python 中可直接使用的数据结构,例如列表(list)、字典(dict)或其他形式。
之所以需要进行这一步转换,是因为 Excel 数据通常以表格形式存储,而 Python 应用在实际开发中更依赖结构化数据来完成处理、集成或存储等操作。因此,在导入过程中,数据往往需要根据具体使用场景转换为不同形式,例如用于顺序处理的列表、用于按字段访问的字典、用于结构建模的自定义对象,或用于持久化存储的数据库。
本文将使用 Spire.XLS for Python 演示如何在 Python 中导入 Excel 文件,并通过实际示例将数据转换为多种结构。
快速导航:
将 Excel 数据导入 Python,本质上可以拆分为两个核心步骤:
这种拆分在实际开发中非常重要,因为仅仅读取 Excel 数据通常无法满足需求——数据必须被转换为可处理、可存储或可集成的结构。
使用 Spire.XLS for Python 导入 Excel 数据时,通常涉及以下几个关键组件:
典型的数据处理流程如下:
Excel 文件 → Workbook → Worksheet → CellRange → Python 数据结构
理解这一流程,有助于你在不同业务场景中设计更灵活的数据导入逻辑。
在运行以下示例前,请先使用 pip 安装 Spire.XLS for Python:
pip install spire.xls
如有需要,也可以手动下载 Spire.XLS for Python 并引入到项目中。
下面的示例展示了最基础的 Excel 数据导入方式:
from spire.xls import *
workbook = Workbook()
workbook.LoadFromFile("SalesReport.xlsx")
data = []
sheet = workbook.Worksheets[0]
# 获取已使用的单元格区域
cellRange = sheet.AllocatedRange
# 读取第一行数据
for col in range(cellRange.Columns.Count):
data.append(sheet.Range[1, col +1].Value)
print(data)
workbook.Dispose()
下图展示了从 Excel 文件中导入的数据示例:

该示例展示了一个基础的数据处理流程:
对于更复杂的场景,例如从内存流中读取 Excel 文件,可以参考如何使用 Python 从内存流中载入 Excel 文件。
将 Excel 数据转换为“按行组成的列表”是最简单、最常见的方式之一。这种结构非常适合用于遍历和基础数据处理。
from spire.xls import *
# 加载工作簿
workbook = Workbook()
workbook.LoadFromFile("SalesReport.xlsx")
# 获取第一个工作表的已用区域
sheet = workbook.Worksheets[0]
cellRange = sheet.AllocatedRange
# 创建用于存储数据的列表
data = []
for row_index in range(cellRange.RowCount):
row_data = []
for cell_index in range(cellRange.ColumnCount):
row_data.append(cellRange[row_index + 1, cell_index + 1].Value)
data.append(row_data)
workbook.Dispose()
将 Excel 数据导入为列表时,每一行数据会被转换为一个 Python 列表,从而保留原始行顺序。
代码执行逻辑:
+1 偏移这种设计的优势:
row_data 保证数据聚合过程清晰这种结构非常适用于:
如果 Excel 文件包含表头,将其导入为字典结构可以显著提升数据的可读性和访问效率。
from spire.xls import *
workbook = Workbook()
workbook.LoadFromFile("SalesReport.xlsx")
sheet = workbook.Worksheets[0]
cellRange = sheet.AllocatedRange
rows = list(cellRange.Rows)
headers = [cellRange[1, cell_index + 1].Value for cell_index in range(cellRange.ColumnCount)]
data_dict = []
for row in rows[1:]:
row_dict = {}
for i, cell in enumerate(row.Cells):
row_dict[headers[i]] = cell.Value
data_dict.append(row_dict)
workbook.Dispose()
将 Excel 数据导入为字典时,每一行数据会被转换为一个“键值对结构”,其中键来自表头,值来自单元格内容。
代码执行逻辑:
这种设计的优势:
这种方式特别适用于:
在一些结构化应用中,你可能需要将 Excel 数据映射为 Python 对象,以实现类型安全并封装业务逻辑。
class Employee:
def __init__(self, name, age, department):
self.name = name
self.age = age
self.department = department
from spire.xls import *
from spire.xls.common import *
workbook = Workbook()
workbook.LoadFromFile("EmployeeData.xlsx")
sheet = workbook.Worksheets[0]
cellRange = sheet.AllocatedRange
employees = []
for row in list(cellRange.Rows)[1:]:
name = row.Cells[0].Value
age = int(row.Cells[1].Value) if row.Cells[1].Value else None
department = row.Cells[2].Value
emp = Employee(name, age, department)
employees.append(emp)
workbook.Dispose()
将 Excel 数据导入为对象,本质上是将每一行数据映射为一个类实例。
代码执行逻辑:
这种设计的优势:
这种方式适用于:
在很多实际应用中,Excel 数据需要被导入数据库,以实现持久化存储和高效查询。
import sqlite3
from spire.xls import *
# 连接 SQLite 数据库
conn = sqlite3.connect("sales.db")
cursor = conn.cursor()
# 创建与 Excel 结构对应的数据表
cursor.execute("""
CREATE TABLE IF NOT EXISTS sales (
product TEXT,
category TEXT,
region TEXT,
sales REAL,
units_sold INTEGER
)
""")
# 加载 Excel 文件
workbook = Workbook()
workbook.LoadFromFile("Sales.xlsx")
# 获取第一个工作表
sheet = workbook.Worksheets[0]
rows = list(sheet.AllocatedRange.Rows)
# 遍历数据行(跳过表头)
for row in rows[1:]:
product = row.Cells[0].Value
category = row.Cells[1].Value
region = row.Cells[2].Value
# 去除千分位分隔符并转换为浮点数
sales_text = row.Cells[3].Value
sales = float(str(sales_text).replace(",", "")) if sales_text else 0
# 转换销量为整数
units_text = row.Cells[4].Value
units_sold = int(units_text) if units_text else 0
# 插入数据
cursor.execute(
"INSERT INTO sales VALUES (?, ?, ?, ?, ?)",
(product, category, region, sales, units_sold)
)
# 提交并关闭连接
conn.commit()
conn.close()
# 释放 Excel 资源
workbook.Dispose()
下图展示了 Excel 数据与 SQLite 数据库结构示例:

将 Excel 数据导入数据库,本质上是将每一行数据转换为一条持久化记录。
代码执行逻辑:
这种设计的优势:
适用场景:
更多 Excel 与数据库操作,请查看如何使用 Python 在 Excel 文件与数据库之间交换数据。
本文示例使用 Spire.XLS for Python,主要基于以下优势:
提供 Workbook、Worksheet、CellRange 等结构,与 Excel 的组织方式高度一致,使数据处理流程更直观。
无需处理底层文件解析,可以直接访问单元格与区域数据,使开发重点集中在数据转换逻辑上。
支持 XLS、XLSX,以及 CSV、ODS、OOXML 等多种格式,可复用同一套导入逻辑。
无需安装 Microsoft Excel,即可处理文件,适用于服务器和自动化环境。
确保 Excel 文件路径正确,并且脚本可以访问。建议使用绝对路径或检查当前工作目录:
import os
print(os.getcwd())
在使用字典结构时,请确保 Excel 第一行为表头,否则键名将不正确。
处理完成后务必释放 Workbook 资源,尤其是在处理大文件时:
workbook.Dispose()
Excel 单元格返回的数据类型可能与预期不一致,需要根据业务进行转换和校验。
在 Python 中,“读取 Excel”与“导入 Excel”是相关但不同的概念:
换句话说:读取是导入的一部分,导入 Excel 数据的目标是“让数据可用”,而不仅是“获取数据”。
在 Python 中导入 Excel 文件,不只是读取数据,更重要的是将数据转换为应用可用的结构。
本文介绍了多种常见 Excel 文件导入方式,包括将 Excel 数据导入为列表(list)、导入为字典(dict)、映射为对象以及存储到数据库。
借助 Spire.XLS for Python,你可以以较少代码实现多种数据结构转换,并高效处理不同格式的 Excel 文件,适用于各类数据处理场景。
如果你需要评估 Spire.XLS for Python 的完整功能,可联系我们申请试用许可。
指将 Excel 数据转换为 Python 数据结构(如列表、字典或数据库),以便进一步处理和集成。
可以使用 Spire.XLS 等库加载 Excel 文件,并通过遍历单元格将数据转换为 Python 结构。
可以。你可以读取 Excel 数据并插入到 SQLite、MySQL、PostgreSQL 等数据库中,常用于数据迁移和系统集成。
取决于使用场景:
不需要。Spire.XLS for Python 可独立运行,无需依赖 Excel 环境。
Spire.PDF for Java 12.3.6 现已正式发布。该版本优化了 PDF 到 PDF/A-1a 的转换并修复了加载 PDF 文档时出现的一些问题。详情请查阅以下内容。
问题修复: