冰蓝科技
|
028-81705109
|
|
微信扫一扫
|

Spire.Cloud 纯前端文档控件

Spire.XLS for Python 15.11.1 现已发布,该版本新增了 RemoveDuplicates 方法,可自动删除工作表中的重复行,并修复了多个已知问题。更多详情如下。

新功能:

问题修复:


获取 Spire.XLS for Python 15.11.1 请点击:

https://www.e-iceblue.cn/Downloads/Spire-XLS-Python.html

本文将详细介绍如何将 Spire.OfficeJS 集成到前端框架 Vue(基于 Vue3 + Vite)中,实现在线打开、预览及编辑 Office 文档的 Web 应用。

通过本教程,你将学会如何:

  • 完整运行一个基于 Vue3 + Vite 的 Spire.OfficeJS 示例项目
  • 将 Office WebAssembly 引擎正确部署到前端工程中
  • 处理文档上传、读取、传递的前端工作流
  • 在浏览器中打开、预览与编辑 Word、Excel、PPT 等 Office 文档
  • 排查常见错误(路径无法加载、跨域、静态资源加载失败等)

文章目录

什么是 Spire.OfficeJS

Spire.OfficeJS 是一款基于 Web 的在线 Office 文档编辑产品,包含 Spire.WordJS、Spire.ExcelJS、Spire.PresentationJS、Spire.PDFJS四个模块,提供文档(Word)、电子表格(Excel)、演示文稿(PowerPoint)等格式的查看与实时编辑能力。它可以直接运行在浏览器中,支持部署在任何 Web 项目中,无需安装插件或依赖客户端软件。

Spire.OfficeJS 的主要特点包括:

  • 纯前端渲染 :基于 WebAssembly,无需服务器转换文档即可编辑
  • 丰富的编辑能力 :支持文档编辑、注释、批注、审阅、保存等操作
  • 多格式支持 :DOCX、XLSX、PPTX、PDF 等常见文档格式
  • 可集成性强 :可灵活嵌入 Vue、React、Angular、纯 HTML 项目
  • 可定制性高 :支持配置工具栏、用户权限、保存回调、插件扩展等

适用于企业后台系统、文档管理系统(DMS)、协作平台、在线课程系统、表单系统等多种场景。

准备工作

安装 Node.js

请从 Node.js 官网下载并安装版本 22.12.0 或更高版本。安装完成后,通过命令验证环境:

node -v
npm -v

查看 Node.js 版本

创建项目并启动服务

步骤1. 创建一个文件夹

选择一个位置创建新文件夹以存放项目文件。

步骤2. 通过 CMD 进入该文件夹

cd /d d:\demo

进入创建的文件夹

步骤3. 初始化 Vue 项目

创建 Vue3 项目并更改项目名称为 vue-spire:

npm init vue@latest

创建Vue项目

跳过其他设置,完成空白的 Vue 项目创建。

完成Vue项目创建

步骤4. 进入项目文件夹并启动服务

cd vue-spire
npm run dev

启动项目

安装 Spire.OfficeJS

步骤1. 下载产品包

下载 Spire.OfficeJS 产品包,解压后可看到一个包含编辑器静态资源的 web 文件夹。

获取Web文件夹

步骤2. 复制静态资源到 Public 目录

使用 VS Code 打开你的 Vue 项目,在 public 目录下创建 spire.cloud 文件夹,并将产品包中的 web 文件夹复制到该目录下。这样,在浏览器中可以通过 /spire.cloud/web/... 访问编辑器资源。

打开Vue项目

步骤3. 安装必要依赖 Pinia 与 Vue Router

使用 VS Code 终端命令行安装 pinia 依赖和 vue-router@4 路由:

npm install pinia
npm install vue-router@4

安装依赖

步骤4. 创建项目结构

在 src 下创建如下目录与文件:

src/
├── router/
│   ├── index.js
├── stores/
│   ├── file.js
├── views/
│   ├── FileUpload.vue
│   └── Spire.OfficeJS.vue

创建目录与文件

步骤5. 添加必要代码

  1. main.js — 加载 Pinia 与 Router

本文件负责初始化整个 Vue 应用,包括:

  • 注册 Pinia(用于全局状态管理)
  • 注册 Vue Router(用于页面跳转)
  • 渲染 App.vue 作为根组件。
import { createApp } from'vue'
import { createPinia } from'pinia'
import App from'./App.vue'
import router from'./router'

const app = createApp(App)

const pinia = createPinia()
app.use(pinia)
app.use(router)
app.mount('#app')
  1. App.vue — 入口视图容器

App.vue 是整个项目的根组件,通常只包含一个路由占位符 <router-view>

<script setup>
import { RouterView } from 'vue-router'
</script>

<template>
    <RouterView/>
</template>

说明:

  • 所有页面均通过 <router-view> 动态加载
  • 这是 SPA(单页应用)的核心机制
  1. 路由 index.js — 页面导航

定义页面路径,例如:

  • /upload → 上传页
  • /document → Spire.OfficeJS 编辑器页
import { createRouter, createWebHistory } from'vue-router'
import FileUpload from'../views/FileUpload.vue'
import SpireOfficeJs from'../views/Spire.OfficeJs.vue'

const router = createRouter({
history: createWebHistory(),
routes: [
        {
path: '/',
name: 'upload',
component: FileUpload
        },
        {
path: '/document',
name: 'document',
component: SpireOfficeJs
        },
        {
path: '/:pathMatch(.*)*',
redirect: '/'
        }
    ]
})

export default router

说明:

  • 使用 history 模式避免 hash (#) URL
  • 路由跳转后页面自动切换显示
  1. Pinia Store(file.js)— 保存上传文件与二进制数据

该 Store 用于保存:

  • 文件名
  • 文件的 ArrayBuffer 二进制内容
import { ref } from'vue'
import { defineStore } from'pinia'

exportconst useFileStore = defineStore('file', () => {
let file = ref(null)
let fileUint8Data = ref(null);

functionsetFileData(data) {
    file.value = data;
  }
functionsetFileUint8Data(data) {
    fileUint8Data.value = data;
  }

return { file, fileUint8Data, setFileData, setFileUint8Data }
})

说明:

  • Pinia 提供响应式状态管理
  • setFileData() 用于存储上传的文件对象
  • setFileUint8Data() 用于存储二进制数据(Uint8Array)
  • 在编辑器页面可随时读取文件内容
  1. FileUpload.vue — 文件上传页

用户选择文件后:

  1. 读取为 ArrayBuffer
  2. 保存到 Pinia Store
  3. 自动跳转至编辑器页面
<template>
<main>
<label>
<span>选择文件上传</span>
<inputtype="file" @change="handleFileChange" />
</label>
</main>
</template>

<scriptsetup>
import { useRouter } from'vue-router'
import { useFileStore } from'../stores/file'

const router = useRouter()
const fileStore = useFileStore()

asyncfunctionhandleFileChange(event) {
const selectedFile = event.target.files?.[0]
if (!selectedFile) {
return
    }
    fileStore.setFileData(selectedFile)
const buffer = await selectedFile.arrayBuffer()
    fileStore.setFileUint8Data(newUint8Array(buffer))
    router.push('/document')
}
</script>

说明:

  • <input type="file"> 选择任意 Office 文档
  • 浏览器的 File API 读为 ArrayBuffer
  • 保存后无需再次上传
  • 页面自动进入编辑器界面
  1. Spire.OfficeJs.vue — 集成 Spire.OfficeJS 在线编辑器

核心功能:

  • 将二进制数据传给 Spire.OfficeJS 在线编辑器
  • 加载文档进行在线编辑
<template>
    <div class="form">
        <div id="iframeEditor">
        </div>
    </div>
</template>

<script setup>
import { ref, onMounted, onUnmounted } from 'vue';
import { storeToRefs } from 'pinia';
import { useFileStore } from '../stores/file.js'
import { useRouter } from 'vue-router';

const fileStore = useFileStore()
// Pinia 中当存储的数据
const { file, fileUint8Data } = storeToRefs(fileStore)
const router = useRouter()
const config = ref({});
const isOpened = ref(false);
const editorInstance = ref(null);
const apiInstance = ref(null);
const originUrl = window.location.origin

onMounted(() => {
    // 没有文件时直接跳回上传页
    if (!file.value) {
        router.replace('/');
        return;
    }
    // 使用script的方式载入
    loadScript();
    window.addEventListener('resize', OnWindowReSize);
})

onUnmounted(() => {
    window.removeEventListener('resize', OnWindowReSize);
})

// 初始化编辑器所需的配置对象
function initConfig() {
    if (!file.value) {
        throw new Error('未找到文件,请重新上传');
    }

    if (!fileUint8Data.value) {
        throw new Error('未找到文件数据,请重新上传');
    }

    config.value = {
        "fileAttrs": {
            "fileInfo": {
                "name": file.value.name,
                "ext": getFileExtension(),
                "primary": String(new Date().getTime()),
                "creator": "Jonn",
                "createTime": "2022-04-18 11:30:43"
            },
            "sourceUrl": originUrl + "/files/__ffff_192.168.2.134/" + file.value.name,
            "createUrl": originUrl + "/open",
            "mergeFolderUrl": "",
            "fileChoiceUrl": "",
            "templates": {}

        },
        "user": {
            "id": "uid-1",
            "name": "Jonn",
            "canSave": true,
        },
        "editorAttrs": {
            "editorMode": "edit", //edit / view
            "editorWidth": "100%",
            "editorHeight": "100%",
            "editorType": "document",
            "platform": "desktop", //desktop / mobile / embedded
            "viewLanguage": "zh", //en / zh
            "isReadOnly": false,
            "canChat": true,
            "canComment": true,
            "canReview": true,
            "canDownload": true,
            "canEdit": true,
            "canForcesave": true,
            "embedded": {
                "saveUrl": "",
                "embedUrl": "",
                "shareUrl": "",
                "toolbarDocked": "top"
            },
            "useWebAssemblyDoc": true,
            "useWebAssemblyExcel": true,
            "useWebAssemblyPpt": true,
            "spireDocJsLicense": "",
            "spireXlsJsLicense": "",
            "spirePresentationJsLicense": "",
            "spirePdfJsLicense": "",
            "serverless": {
                "useServerless": true,
                "baseUrl": originUrl,
                "fileData": fileUint8Data.value,
            },
            "events": {
                "onSave": onFileSave
            },
            "plugins": {
                "pluginsData": []
            }
        }
    };
}

// 创建并渲染 SpireCloudEditor 实例
function initEditor() {
    let iframeId = 'iframeEditor';

    initConfig();
    isOpened.value = true;
    editorInstance.value = new SpireCloudEditor.OpenApi(iframeId, config.value); // 创建编辑器实例
    window.Api = apiInstance.value = editorInstance.value.GetOpenApi(); // 暴露 OpenApi 便于调试/保存
    OnWindowReSize();
}

// 获取上传文件的扩展名,用于配置 fileInfo.ext
function getFileExtension() {
    const filename = file.value.name.split(/[\\/]/).pop();
    // 获取最后一个点后的内容
    return filename.substring(filename.lastIndexOf('.') + 1).toLowerCase() || '';
}
// 调整编辑器容器尺寸,使其随窗口大小自适应
function OnWindowReSize() {
    let wrapEl = document.getElementsByClassName("form");
    if (wrapEl.length) {
        wrapEl[0].style.height = screen.availHeight + "px";
        window.scrollTo(0, -1);
        wrapEl[0].style.height = window.innerHeight + "px";
    }
}
// 动态加载 SpireCloudEditor 脚本,避免重复注入
function loadScript() {
    if (window.SpireCloudEditor) {
        initEditor()
        return
    }
    const script = document.createElement('script');
    script.setAttribute('src', '/spire.cloud/web/editors/spireapi/SpireCloudEditor.js');
    script.onload = () => initEditor()
    document.head.appendChild(script);
}
// Spire 编辑器的保存回调,可接入自定义保存逻辑
function onFileSave(data) {
    console.log('save data', data)
}

</script>

<style>
.form,
iframe,
body {
    min-height: 100vh !important;
    min-width: 100vh !important;
}
</style>

说明:

  • Spire.Office.Editor 创建编辑器实例
  • 将用户上传的文件加载成可编辑文档
  • 支持 Word、Excel、PowerPoint 等格式

步骤6. 运行项目

在 VS Code 终端输入:

npm run dev

运行项目

在浏览器输入 http://localhost:5173/(默认),并上传文档。

上传文档

上传文档后,即可在 Web 页面使用 Spire.OfficeJS 实现在线编辑。

在线编辑文档

常见问题解答

Q1. 编辑器加载失败,页面空白?

可能原因如下:

  • 静态资源路径错误
  • SpireCloudEditor.js 未成功加载
  • WebAssembly 文件未找到

Q2. 上传文件后跳转到编辑器但无法打开?

请检查:

  • 文件二进制是否已正确写入 Pinia
  • fileUint8Data 是否为 Uint8Array 格式
  • serverless.fileData 是否成功传入编辑器配置

Q3. 支持哪些文件格式?

常见格式包括:

  • .doc, .docx
  • .xls, .xlsx
  • .ppt, .pptx
  • .pdf (仅浏览)

Q4. 能否实现自定义保存?

可以,通过配置:

events: {
onSave: onFileSave
}

你可以将 data 传给后端 API,实现真正的文件持久化。

Q5. 可以部署到生产服务器吗?

可以,部署时需确保:

  • 保留 /public/spire.cloud/web/ 的完整结构
  • 使用 HTTPS 以避免浏览器安全策略阻止加载 WebAssembly
  • 根据环境设置正确的 baseUrl

完整示例下载

点击下载

申请临时License

如果您需要去除生成文档中的评估提示或解除功能限制,请联系我们获取有效期 30 天的临时许可证。

Spire.Doc 13.11.5 现已发布。该版本优化了OfficeMath处理,提升了公式展示效果。详情如下

调整:


获取Spire.Doc 13.11.5,请点击:

https://www.e-iceblue.cn/Downloads/Spire-Doc-NET.html

Spire.PDF 11.11.5 现已发布。该版本重点修复了 PDF 转换相关问题,包括 PDF 转 PDF/A、PDF 转图片、打印效果、水印表现、OFD 转换以及部分异常错误。同时,还优化了 NetStandard DLL 转图片的性能,进一步提升了产品的稳定性与处理效率。详情如下:

问题修复:


获取 Spire.PDF 11.11.5,请点击:

https://www.e-iceblue.cn/Downloads/Spire-PDF-NET.html

Spire.Presentation for Java 10.11.4 现已发布。本次更新主要针对跨平台使用场景提升稳定性,修复了在 ColdFusion 平台调用组件时出现 NullReferenceException 的问题,从而增强了整体兼容性与可靠性。更新详情如下:

问题修复:


获取 Spire.Presentation for Java 10.11.4,请点击以下链接:

https://www.e-iceblue.cn/Downloads/Spire-Presentation-JAVA.html

Spire.Presentation for Python 10.11.1 已发布,本次更新主要修复了在将 PowerPoint 文件转换为图片时出现的问题。具体更新内容如下。

问题修复:


获取Spire.Presentation for Python 10.11.1,请点击

https://www.e-iceblue.cn/Downloads/Spire-Presentation-Python.html

Spire.Doc for Java 13.11.2 现已正式发布。该版本支持在 Word 文档中创建组合图表,此外还修复了一些在转换 Word 到 PDF、Markdown 到 Word,和加载、保存 Word 文档时出现的问题。详情如下。

新功能:

问题修复:


获取 Spire.Doc for Java 13.11.2 请点击:

https://www.e-iceblue.cn/Downloads/Spire-Doc-JAVA.html

CSV(逗号分隔值)是一种用于存储表格数据的通用文件格式,而列表是 Python 中用于轻松进行数据操作的基本数据结构。在 Python 中将 CSV 转换为列表,能实现数据的无缝处理、分析及与其他工作流的集成。虽然 Python 内置的 csv 模块可满足基础需求,但 Spire.XLS for Python 凭借类电子表格的直观界面,能更简化结构化 CSV 数据的处理流程。

本文将通过实用代码示例介绍如何使用 Python 读取 CSV 并转化为列表,覆盖从基础到进阶的各类场景。

目录:


为何选择 Spire.XLS ?

Spire.XLS 是一款强大的电子表格处理库,在 CSV 处理方面优势显著:

  • 直观的索引:行列索引均从1开始(与电子表格逻辑一致)。
  • 灵活的分隔符:可轻松指定自定义分隔符(逗号、制表符、分号等均可)。
  • 结构化访问:将 CSV 数据视为工作表,行列遍历更简单直接。
  • 强大的数据处理:自动解析数字、日期、字符串等类型,无需额外编写解析代码。

安装步骤

开始前,通过 pip 安装Spire.XLS for Python:

pip install Spire.XLS

该命令会安装最新稳定版本,安装完成后即可直接在项目中使用。


基础转换:Python 将 CSV 转换为列表

若 CSV 文件无标题行(纯数据行),Spire.XLS 可直接读取行数据并将其转换为“列表的列表”(每个子列表对应 CSV 中的一行)。

操作步骤:

  1. 导入 Spire.XLS 模块;
  2. 创建 Workbook 对象并加载 CSV 文件;
  3. 获取第一个工作表(Spire.XLS 会自动将 CSV 解析为工作表);
  4. 遍历行和单元格,提取值并存入 Python 列表。

CSV 转列表的 Python 代码示例:

from spire.xls import *
from spire.xls.common import *

# 初始化工作簿并加载 CSV 文件
workbook = Workbook()
workbook.LoadFromFile("数据.csv", ",")

# 获取第一个工作表
sheet = workbook.Worksheets[0]

# 初始化列表用于存储转换后的数据
data_list = []
# 遍历工作表的每一行
for i in range(sheet.Rows.Length):
    row = []  # 存储当前行的数据
    # 遍历当前行的每一列
    for j in range(sheet.Columns.Length):
        cell_value = sheet.Range[i + 1, j + 1].Value
        row.append(cell_value)
    data_list.append(row)  # 将当前行数据加入总列表

# 打印转换结果
for row in data_list:
    print(row)

# 释放资源
workbook.Dispose()

输出效果:

通过Python代码将CSV文件转换为列表

如需将列表转回 CSV 格式,可参考:Python 将列表导出为 CSV 文件(含一维/二维/字典列表)


进阶操作:将 CSV 转换为字典列表

对于含标题行的CSV文件,转换为“字典列表”(键为标题、值为行数据)更便于数据操作。

CSV 转字典列表的 Python 代码示例:

from spire.xls import *

# 初始化工作簿并加载CSV文件
workbook = Workbook()
workbook.LoadFromFile("示例.csv", ",")

# 获取第一个工作表
sheet = workbook.Worksheets[0]

# 提取标题行(第一行数据作为字典的键)
headers = []
for j in range(sheet.Columns.Length):
    headers.append(sheet.Range[1, j + 1].Value)  # 1基索引取第一行

# 初始化列表用于存储字典
dict_list = []
# 遍历数据行(从第二行开始,跳过标题行)
for i in range(1, sheet.Rows.Length):
    row_dict = {}  # 存储当前行的键值对
    for j in range(sheet.Columns.Length):
        key = headers[j]  # 标题作为键
        value = sheet.Range[i + 1, j + 1].Value  # 当前单元格值作为值
        row_dict[key] = value
    dict_list.append(row_dict)  # 将字典加入列表

# 打印转换结果
for record in dict_list:
    print(record)

# 释放资源
workbook.Dispose()

代码说明:

  • 加载CSV:通过 Workbook 类的 LoadFromFile() 方法加载文件,指定分隔符;
  • 提取标题:将工作表第一行数据作为字典的键,保留列的含义;
  • 映射行到字典:遍历数据行时,用标题作为键、单元格内容作为值,构建字典并加入列表。

输出效果:

通过Python代码将CSV文件转换为字典列表


特殊场景处理

含自定义分隔符的 CSV(如制表符、分号)

处理非逗号分隔的 CSV 文件(如制表符分隔的 TSV 文件)时,只需在 LoadFromFile 中指定分隔符:

# 加载制表符分隔的文件(TSV)
workbook.LoadFromFile("data.tsv", "\t")

# 加载分号分隔的文件(常见于欧洲地区数据)
workbook.LoadFromFile("data_eu.csv", ";")

空值清理技巧

CSV 中的空单元格会被转换为空字符串('')。若需将空值替换为自定义内容(如 “N/A”),可修改单元格值提取逻辑:

# 为空值设置默认值“N/A”
cell_value = sheet.Range[i + 1, j + 1].Value or "N/A"

总结

使用 Spire.XLS 在 Python 中将 CSV 转换为列表的方法十分高效、灵活且对初学者友好。无论您需要“列表的列表”存储原始数据,还是“字典列表”用于结构化分析,该库都能高效处理解析、索引及资源管理。通过本文示例,你可轻松将此转换集成到数据管道、分析脚本或应用程序中。

如需了解更多高级功能(如 CSV 转 Excel、批量处理等),可访问 Spire.XLS for Python 文档


常见问题解答

Q1:Spire.XLS 是否适用于大型 CSV 文件?

A: 是的,Spire.XLS 能高效处理大型文件。但对于超大规模数据集(数百万行),建议分块处理或结合大数据工具;对于常规业务数据,其性能表现优异。

Q2:与 pandas 相比,用 Spire.XLS 转换 CSV 到列表有何优势?

A: Spire.XLS 提供了对解析过程更多的控制,并且不需要额外的数据科学依赖。虽然 pandas 非常适合分析,但当您需要精确控制 CSV 解析或在没有 pandas 的环境中工作时,Spire.XLS 是理想选择。

Q3:转换为列表时,如何处理带有标题的 CSV 文件?

A: 推荐使用“字典列表”转换法:提取第一行作为标题(字典的键),后续行数据作为值,既能保留列含义,又便于通过列名访问数据。

Q4:如何仅将 CSV 中的特定列转换为列表?

A: 可通过指定目标列索引修改内循环逻辑:

# 仅转换第1列和第3列(对应索引0和2)
target_columns = [0, 2]
for i in range(sheet.Rows.Length):
    row = []
    for j in target_columns:
        cell_value = sheet.Range[i + 1, j + 1].Value
        row.append(cell_value)
    data_list.append(row)

在数据处理与交换中,CSV(逗号分隔值)格式因简洁通用,成为跨应用、跨数据库的数据交换首选。对于 Python 开发者而言,将 Python 列表转换为 CSV 格式是高频需求——无论是导出应用数据、生成报表,还是准备分析数据集,都离不开这一操作。

Spire.XLS for Python 凭借直观可靠的方法简化了这一过程,无需依赖 Microsoft Excel,即可轻松将各类列表导出到 CSV 文件。本文将分步骤详解如何利用该工具实现转换,覆盖从简单一维列表到复杂字典列表的全场景。

目录

Spire.XLS for Python 快速入门

为什么选择 Spire.XLS?

Python内置的 csv 模块可满足基础需求,但 Spire.XLS 提供了更强大的功能:

  • 无缝兼容多种数据类型(字符串、数字、布尔值等);
  • 支持自定义分隔符(如分号,适配欧洲地区格式);
  • 可导出为 CSV、XLSX、XLS 等多种格式;
  • 对简单或复杂数据结构(嵌套列表、字典列表)均有良好支持。

安装步骤

通过 pip 即可快速安装 Spire.XLS for Python,在终端或命令提示符中运行:

pip install Spire.XLS

安装完成后,即可直接导入模块开始编码。

Python 将一维列表导出为 CSV 文件

一维列表是简单的序列值(如 ["苹果", "香蕉", "樱桃"])。 以下是将这些值写入 CSV 中的单行或单列的步骤。

步骤 1:导入 Spire.XLS 模块

首先,从 Spire.XLS 导入必要的类:

from spire.xls import *
from spire.xls.common import *

步骤2:创建工作簿与工作表

Spire.XLS 使用工作簿和工作表来组织数据。我们将创建一个新的工作簿并添加一个新的工作表:

# 初始化工作簿
workbook = Workbook()
# 清除默认工作表,新建一个工作表
workbook.Worksheets.Clear()
worksheet = workbook.Worksheets.Add("一维列表")

步骤 3:将一维列表数据写入工作表

可以选择将列表写入单行(水平)或单列(垂直)。

示例 1:将一维列表写入单行

data_list = ["苹果", "香蕉", "橙子", "葡萄", "芒果"]
# 循环写入第1行,列索引从1开始
for i, item in enumerate(data_list):
   worksheet.Range[1, i+1].Value = item

示例 2:将一维列表写入单列

data_list = ["苹果", "香蕉", "橙子", "葡萄", "芒果"]
# 循环写入第1列,行索引从1开始
for i, item in enumerate(data_list):
   worksheet.Range[i+1, 1].Value = item

步骤 4:将工作表保存为 CSV 文件

使用 SaveToFile() 将工作簿导出为 CSV 文件。指定 FileFormat.CSV 以确保正确的格式:

# 指定文件格式为CSV
workbook.SaveToFile("一维列表.csv", FileFormat.CSV)
# 释放资源
workbook.Dispose()

输出效果:

Python一维列表转CSV效果

Python 将二维列表导出为 CSV 文件

二维列表是“列表的列表”,适合表示表格数据(如包含表头和多行记录),每个内部列表对应 CSV 的一行。

二维列表输出为 CSV 格式的 Python 代码:

from spire.xls import *
from spire.xls.common import *

# 初始化工作簿与工作表
workbook = Workbook()
workbook.Worksheets.Clear()
worksheet = workbook.Worksheets.Add("二维列表")

# 示例二维列表(含表头和数据)
data = [
    ["姓名", "年龄", "城市", "员工号"],
    ["小张", 30, "北京", 1001],
    ["小王", 25, "广东", 1069],
    ["小李", 35, "天津", 2078],
    ["小孙", 28, "武汉", 2692]
]

# 双层循环写入行和列
for row_idx, row_data in enumerate(data):
    for col_idx, cell_data in enumerate(row_data):
        # 转换为字符串确保兼容性
        worksheet.Range[row_idx+1, col_idx+1].Value = str(cell_data)

# 保存为CSV
workbook.SaveToFile("二维列表.csv", FileFormat.CSV)
workbook.Dispose()

关键说明:

  • 适合结构化表格数据(带表头);
  • 通过嵌套循环遍历行和列;
  • 所有值转为字符串,避免数据类型冲突。

输出效果:

Python二维列表转CSV效果

扩展技巧:生成的 CSV 可以 转换为 PDF 用于安全展示,或转换为 JSON 用于 Web/API 数据交换。

Python 将字典列表导出为 CSV 文件

字典列表(如 [{"姓名": "小张", "年龄": 30}, ...])适合处理带字段名的数据,字典的键作为 CSV 表头,值作为行数据。

字典列表输出为 CSV 格式的 Python 代码:

from spire.xls import *
from spire.xls.common import *

# 初始化工作簿与工作表
workbook = Workbook()
workbook.Worksheets.Clear()
worksheet = workbook.Worksheets.Add("字典列表")

# 示例字典列表
customer_list = [
    {"客户ID": 101, "姓名": "小张", "邮箱": "该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。"},
    {"客户ID": 102, "姓名": "小王", "邮箱": "该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。"},
    {"客户ID": 103, "姓名": "小孙", "邮箱": "该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。"}
]

# 提取表头并写入第1行(若列表非空)
if customer_list:
    headers = list(customer_list[0].keys())
    # 写入表头
    for col_idx, header in enumerate(headers):
        worksheet.Range[1, col_idx+1].Value = str(header)
    
    # 写入数据行(从第2行开始)
    for row_idx, record in enumerate(customer_list):
        for col_idx, header in enumerate(headers):
            # 安全获取值,缺失键时用空字符串
            value = record.get(header, "")
            worksheet.Range[row_idx+2, col_idx+1].Value = str(value)

# 保存为CSV
workbook.SaveToFile("字典列表.csv", FileFormat.CSV)
workbook.Dispose()

关键说明:

  • 表头从第一个字典的键中提取;
  • 使用 record.get(header, "") 处理可能的缺失键;
  • 严格按表头顺序排列列,确保数据对齐。

输出效果:

Python字典列表转CSV效果

进阶:自定义分隔符与编码

Spire.XLS 支持灵活设置 CSV 文件的分隔符(默认逗号)和编码,适配不同地区或系统需求。通过 Worksheet.SaveToFile() 方法的参数指定:

# 分号分隔(欧洲常用),UTF-8编码
worksheet.SaveToFile("分号分隔.csv", ";", Encoding.get_UTF8())

# 制表符分隔,UTF-8编码
worksheet.SaveToFile("制表符分隔.csv", "\t", Encoding.get_UTF8())

# 逗号分隔,Unicode编码
worksheet.SaveToFile("Unicode编码.csv", ",", Encoding.get_Unicode())

总结

借助 Spire.XLS for Python,无论是简单的一维列表、结构化的二维列表,还是带字段名的字典列表,都能高效导出到 CSV 文件。只需根据数据结构选择对应方法,即可确保转换准确、输出专业。更多高级功能可参考 Spire.XLS for Python 教程合集

常见问题解答

1. 导出列表到 CSV 格式的最佳实践是什么?

  • 转换前验证数据格式(如缺失值、异常类型);
  • try-catch 块捕获异常(如文件权限错误);
  • 大型数据集先通过样本测试;
  • 完成后调用 Dispose() 释放资源。

2. 如何一次性导出多个列表到不同 CSV 文件?

通过循环遍历列表字典,逐个保存:

lists = {
    "水果": ["苹果", "香蕉", "樱桃"],
    "分数": [85, 92, 78]
}

for name, data in lists.items():
    wb = Workbook()
    wb.Worksheets.Clear()
    ws = wb.Worksheets.Add(name)
    for i, val in enumerate(data):
        ws.Range[i+1, 1].Value = str(val)
    wb.SaveToFile(f"{name}.csv", FileFormat.CSV)
    wb.Dispose()

3. 如何在 CSV 文件中格式化数字(如货币、小数)?

CSV 以文本存储数字,需提前设置格式:

# 设置A1:A10为货币格式($1,234.56)
ws.Range["A1:A10"].NumberFormat = "$#,##0.00"

更多格式可参考:Python 在 Excel 中设置数字格式

4. Spire.XLS for Python 支持哪些操作系统?

全平台支持,包括 Windows、macOS 和 Linux。

将 PowerPoint 转换为图片(PNG、JPG、TIFF、EMF、SVG)

在日常工作中,我们常常遇到一些需要将 PowerPoint 文档转换为图片的情况。比如说想要避免其他人修改幻灯片上的内容,或者在 PowerPoint 的基础上生成缩略图,又或者想要在社交媒体上分享这个 PowerPoint 文档。在今天的指南中,我们一起来看看怎样通过 Spire.Presentation for .NET,使用 C# 将 PowerPoint 转换为多种格式的图片,轻松完成工作!

安装 Spire.Presentation for .NET

在开始之前,你需要先将 Spire.Presentation for .NET 包中包含的 DLL 文件添加到 .NET 项目中作为引用。这些 DLL 文件可以通过下载获取,也可以直接通过 NuGet 进行安装。

PM> Install-Package Spire.Presentation

在 C# 和 中将 PowerPoint 文档转换为 JPG 或 PNG

JPG 和 PNG 都是常见的位图格式,可以直接通过 Spire.Presentation 提供的 ISlide.SaveAsImage() 方法将 PowerPoint 幻灯片转换为这两种图片格式。下面是具体的转换步骤:

  • 创建一个 Presentation 类的实例。
  • 通过 Presentation.LoadFromFile() 方法加载 PowerPoint 文档。
  • 遍历文档中的所有幻灯片。
  • 使用 ISlide.SaveAsImage() 方法将每个幻灯片保存为 System.Drawing.Image
  • 通过 Image.Save() 方法将图片对象保存为 PNG 或 JPG 文件。

下面的代码展示了怎样将一个 PowerPoint 演示文稿转换为 PNG 格式的图片:

using Spire.Presentation;
using System.Drawing;

namespace ConvertPowerPointToJpgOrPngImage
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建一个 Presentation 实例
            Presentation presentation = new Presentation();
            // 加载一个 PowerPoint 演示文稿
            presentation.LoadFromFile(@"\input\幻灯片2.pptx");

            int i = 0;
            // 遍历所有幻灯片
            foreach (ISlide slide in presentation.Slides)
            {
                // 将幻灯片保存为 PNG 图片
                Image image = slide.SaveAsImage();
                string fileName = string.Format("\output\JPGPNG\图-{0}.png", i);
                image.Save(fileName, System.Drawing.Imaging.ImageFormat.Png);
                i++;
            }
        }
    }
}

转换后的 PNG 图片预览: C# 将 PowerPoint 转换为 PNG

在 C# 中将 PowerPoint 文档转换为 TIFF

在一些工作中,我们可能需要将 PowerPoint 幻灯片保存为 TIFF 格式的图片。与 JPG 或 PNG 不同,TIFF 支持高质量、无损压缩,非常适合打印或专业图像处理等场景。使用 Spire.Presentation for .NET,我们可以轻松完成这一转换。

主要步骤如下:

  • 创建一个 Presentation 类的实例。
  • 使用 Presentation.LoadFromFile() 方法加载 PowerPoint 文档。
  • 调用 Presentation.SaveToFile(string, FileFormat) 方法,将整个文档保存为 TIFF 图片格式。

下方是将 PowerPoint 文档转换为 TIFF 图片的代码示例:

using Spire.Presentation;

namespace ConvertPowerPointToTiffImage
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建一个 Presentation 实例
            Presentation presentation = new Presentation();
            // 加载 PowerPoint 文档
            presentation.LoadFromFile(@"\input\幻灯片2.pptx");

            // 文档转换为 TIFF 图片
            presentation.SaveToFile("output\TIFF\转TIFF.tiff", FileFormat.Tiff);
        }
    }
}

转换后的 TIFF 图片预览: C# 将 PowerPoint 转换为 TIFF 图片

在 C# 中将 PowerPoint 文档转换为 EMF

EMF(Enhanced Metafile)是一种矢量图格式,相比位图格式(如 JPG、PNG),它在放大时不会失真,因此非常适合用于打印或高分辨率显示场景。通过 ISlide.SaveAsEMF() 方法,我们可以快速将幻灯片保存为 EMF 格式的图片。下面来看看主要的操作步骤和代码示例。

主要步骤如下:

  • 创建一个 Presentation 类的实例。
  • 使用 Presentation.LoadFromFile() 方法加载 PowerPoint 文档。
  • 遍历文档中的所有幻灯片。
  • 使用 ISlide.SaveAsEMF() 方法将每个幻灯片保存为 EMF 图片。

下方为将 PowerPoint 演示文稿转换为 EMF 的完整代码示例:

using Spire.Presentation;

namespace ConvertPowerPointToEmfImage
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建一个 Presentation 实例
            Presentation presentation = new Presentation();
            // 加载 PowerPoint 文档
            presentation.LoadFromFile(@"\input\\幻灯片2.pptx");

            int i = 0;
            // 遍历文件中的每一张幻灯片
            foreach (ISlide slide in presentation.Slides)
            {
                string fileName = string.Format("output\EMF\图-{0}.emf", i);
                // 将幻灯片保存为 EMF 图片
                slide.SaveAsEMF(fileName);
                // 保存幻灯片为指定宽高的 EMF 图片
                //slide.SaveAsEMF(fileName, 1075, 710);
                i++;
            }
        }
    }
}

转换后的 EMF 图片预览: C# 将 PowerPoint 转换为 EMF

小提示:如果你在进行网页设计时需要使用 PowerPoint 文件,除了将它转换为 EMF 或 SVG 格式外,还可以将 PowerPoint 转换为 HTML,以便进行更灵活的编辑与个性化设计。

在 C# 中将 PowerPoint 文档转换为 SVG

SVG(Scalable Vector Graphics)是一种基于矢量的图像格式,具有可无限缩放且不失真的优点,同样适合在网页上使用,在进行设计时也很常见。通过调用 Spire.Presentation for .NET 提供的 Presentation.SaveToSVG() 方法,我们可以一次性将整个 PowerPoint 文件转换为 SVG。

将演示文稿转换为 SVG 图片的主要步骤:

  • 创建一个 Presentation 类的实例。
  • 使用 Presentation.LoadFromFile() 方法加载 PowerPoint 文档。
  • 调用 Presentation.SaveToSVG() 方法,将 PowerPoint 文档转换为 SVG,并将结果保存到一个字节数组队列(Queue)中。
  • 遍历该队列中的字节数组。
  • 在每次循环中,使用 Queue.Dequeue() 方法取出队列开头的字节数组。
  • 创建一个 FileStream 类的实例,并通过 FileStream.Write() 方法将字节数组写入到 SVG 文件中。

下方为 PowerPoint 转换到 SVG 的完整代码示例:

using Spire.Presentation;
using System.Collections.Generic;
using System.IO;

namespace ConvertPowerPointToSvgImage
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建一个 Presentation 的实例
            Presentation presentation = new Presentation();
            // 加载 PowerPoint 文档
            presentation.LoadFromFile(@"\input\幻灯片2.pptx");

            // 将 PowerPoint 文档转换为 SVG 并获取字节队列
            Queue<byte[]> svgBytes = presentation.SaveToSVG();

            int index = 0;
            while (svgBytes.Count > 0)
            {
                byte[] bt = svgBytes.Dequeue();
                string fileName = $@"\output\SVG\图-{index}.svg";
                File.WriteAllBytes(fileName, bt);
                index++;
            }
        }
    }
}

转换后的 SVG 图片预览: C# 将 PowerPoint 转换为 SVG

小提示:如果你只想从幻灯片中提取图片,而不是将整页幻灯片转换为图像,可以参考这篇教程:如何从 PowerPoint 幻灯片中提取图像 >>

总结

以上就是使用 Spire.Presentation for .NET 将 PowerPoint 文档转换为多种图片格式的几种方法。无论是用于展示、分享还是后期编辑,这些方法都能让你轻松实现格式转换。如果在使用过程中遇到任何问题,或想了解更多产品功能,欢迎随时该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取技术支持与帮助。