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

Spire.Cloud 纯前端文档控件

Spire.Doc for Java 13.8.7 现已正式发布。该版本主要提升了稳定性,修复了多项问题,包括Word转PDF错误、修订跟踪问题以及文档加载异常等。更多详情如下。

问题修复:


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

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

Java 字节数组转PDF

在现代 Java 应用中,PDF 数据并不总是以文件形式存储在磁盘上。它可能通过网络传输、由 REST API 返回,或以字节数组形式存储在数据库中。这类场景中,我们经常需要将字节数组还原为 PDF 文件,甚至需要从纯文本字节生成新的 PDF 文档。

本教程将介绍如何使用 Spire.PDF for Java 在 Java 中将字节(Byte)数组转换为PDF文档

目录:

Spire.PDF for Java 入门指南

Spire.PDF 是一款功能强大的 API,为 Java 开发者提供无需依赖 Adobe Acrobat 即可创建、读取、编辑、转换和打印 PDF 文档的能力。

核心功能:

  • 生成包含文本、图片、表格和形状的 PDF 文档。
  • 编辑现有 PDF 并支持文本与图像提取。
  • PDF 转换为 HTML、Word、Excel 及图像等多种格式。
  • 通过密码保护实现 PDF 加密。
  • 添加水印、注释及数字签名。

安装:

请从官方网站下载 Spire.PDF for Java,并将 JAR 文件添加到项目的构建路径中。若使用 Maven 项目管理工具,请在 pom.xml 文件中配置以下依赖项:

<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.pdf</artifactId>
        <version>11.11.11</version>
    </dependency>
</dependencies>

环境配置完成后,即可开始执行字节数组转 PDF 及其他 PDF 相关操作。

解析 PDF 字节与文本字节的区别

在编写代码前,需要明确区分两种截然不同的字节数组类型:

  • PDF 文件字节 :代表有效 PDF 文档的实际二进制结构。这类字节始终以 %PDF-1.x 开头,包含对象、交叉引用表和流数据。此类字节数组可直接加载到 PdfDocument 对象中。
  • 文本字节 :仅仅是字符的 ASCII 或 UTF-8 编码。例如:
byte[] bytes = {-26, -83, -92};  
System.out.println(new String(bytes, java.nio.charset.StandardCharsets.UTF_8)); // 输出结果:"此"

这类数组并非有效的 PDF 数据,但可以通过创建新 PDF 文档并将文本内容写入其中来实现转换。

Java 从字节数组加载 PDF 文档

假设你想从 URL 下载一个 PDF,并将其作为字节数组在内存中处理。使用 Spire.PDF for Java,你可以轻松加载并将其保存为 PDF 文档。

import com.spire.pdf.PdfDocument;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class LoadPdfFromByteArray throws Exception {

    public static void main(String[] args) {
        
        // PDF URL
        String fileUrl = "https://www.e-iceblue.com/resource/sample_pdf_for_download.pdf";

        // 将 PDF 下载为字节数组
        byte[] pdfBytes = downloadPdfAsBytes(fileUrl);

        // 创建 PdfDocument 对象
        PdfDocument doc = new PdfDocument();

        // 从字节数组加载 PDF
        doc.loadFromStream(new ByteArrayInputStream(pdfBytes));

        // 将文档保存到本地
        doc.saveToFile("downloaded.pdf");
        doc.close();
    }

    // 辅助方法:将文件下载为字节数组
    private static byte[] downloadPdfAsBytes(String fileUrl) throws Exception {
        URL url = new URL(fileUrl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");

        InputStream inputStream = conn.getInputStream();
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();

        byte[] data = new byte[4096];
        int nRead;
        while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
            buffer.write(data, 0, nRead);
        }

        buffer.flush();
        inputStream.close();
        conn.disconnect();

        return buffer.toByteArray();
    }
}

工作原理:

  1. 发出 HTTP 请求以获取 PDF 文件。
  2. 使用 ByteArrayOutputStreamInputStream转换为字节数组。
  3. 通过 loadFromStream将字节数组传递给 Spire.PDF。
  4. 根据需要保存或处理文档。

效果图:

Java 从字节数组加载 PDF 文档

Java 基于文本字节创建 PDF 文档

如果你只有纯文本字节(例如:“此文档是由文本字节创建的。”),你可以将其解码为字符串,然后将文本绘制到新的 PDF 文档中。

import com.spire.pdf.*;
import com.spire.pdf.graphics.*;
import java.awt.*;

public class TextFromBytesToPdf {
    public static void main(String[] args) {

        // 你的文本字节
        byte[] byteArray = {

                -26, -83, -92, // 此
                -26, -106, -121, // 文
                -26, -95, -93, // 档
                -26, -104, -81, // 是
                -25, -108, -79, // 由
                -26, -106, -121, // 文
                -26, -100, -84, // 本
                -27, -83, -105, // 字
                -24, -118, -126, // 节
                -27, -120, -101, // 创
                -27, -69, -70, // 建
                -25, -102, -124, // 的
                -29, -128, -126 // 。
        };
        String text = new String(byteArray, java.nio.charset.StandardCharsets.UTF_8);

        // 创建 PDF 文档
        PdfDocument doc = new PdfDocument();

        // 配置页面设置
        doc.getPageSettings().setSize(PdfPageSize.A4);
        doc.getPageSettings().setMargins(40f);

        // 添加页面
        PdfPageBase page = doc.getPages().add();

        // 将字符串绘制到 PDF 上
        PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("黑体", 1, 16),true);
        PdfSolidBrush brush = new PdfSolidBrush(new PdfRGBColor(Color.black));
        page.getCanvas().drawString(text, font, brush, 20, 40);

        // 将文档保存为 PDF 文件
        doc.saveToFile("TextBytes.pdf");
        doc.close();
    }
}

这将生成一个名为 TextBytes.pdf 的新 PDF 文件(如下所示),其中包含你的字节数组所表示的文本。

Java通过字节数组创建PDF文档

您可能会感兴趣:如何在 Java 中生成 PDF 文档

常见误区与避免方法

将字节数组转换为 PDF 时,需注意以下问题:

  • 混淆纯文本与PDF****字节流

并非所有字节数组都是有效的 PDF。除非数组以 %PDF-1.x 开头且包含完整结构体,否则无法直接使用PdfDocument.loadFromStream加载。

  • 编码格式错误

若文本字节采用 UTF-16ISO-8859-1或其他编码,创建字符串时需指定字符集:

String text = new String(byteArray, StandardCharsets.UTF_8);
  • 大体积字节数组处理

处理大型 PDF 时,建议采用流式传输而非完全加载到内存,避免 OutOfMemoryError异常。

  • 遗漏文档关闭操作

保存或处理 PDF 后务必调用 doc.close() 来释放资源。

常见问题解答

Q1. 能否将 PDF 以字节数组形式存入数据库?

可以。您可以将 PDF 作为 BLOB 类型存储在关系型数据库中,后续可检索并加载到 PdfDocument对象中进行保存或编辑。

Q2. 如何验证字节数组是否为有效 PDF?

检测数组是否以 %PDF- 开头即可。示例代码:

String header = new String(Arrays.copyOfRange(bytes, 0, 5));
if (header.startsWith("%PDF-")) {
    // 有效的PDF文件
}

Q3. Spire.PDF 能否直接从 InputStream 加载 PDF?

可以。无需转换为字节数组,可直接将 InputStream传递给 loadFromStream() 方法。

Q4. 能否将 PdfDocument 重新转换为字节数组?

可通过 ByteArrayOutputStream 保存文档:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
doc.saveToStream(baos);
byte[] pdfBytes = baos.toByteArray();

Q5. 若字节数组包含的是图像而非文本或 PDF 怎么办?

此情况下需要创建新 PDF 文档,并使用 Spire.PDF 的绘图 API 插入图像。

总结

本文探讨了如何通过 Spire.PDF for Java 实现字节数组与 PDF 文档的转换。无论您是通过 API 获取字节数组加载现有 PDF 文件,还是从纯文本字节创建新 PDF,Spire.PDF 都能提供可靠的解决方案。

我们重点解析了 PDF 文件字节与文本字节的本质区别,并指出转换过程中需要规避的常见误区。通过掌握这些核心概念和工具,您可以在 Java 应用中无缝集成字节数组到 PDF 的转换功能,提升文档数据的管理与处理能力。

申请临时License

如果您需要去除生成文档中的评估提示或解除功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。

在 Java 中将 PDF 转换为 CSV – 提取表格并保存为 CSV

在处理以 PDF 格式存储的报告、发票或数据集时,开发人员常常需要在电子表格、数据库或分析工具中复用其中的表格数据。一个常见的解决方案是 使用 Java 将 PDF 转换为 CSV,因为 CSV 文件轻量、结构化,并且几乎在所有平台上都兼容。

与文本或图片导出不同,PDF 转 CSV 的核心是 从 PDF 中提取表格并保存为 CSV。借助 Spire.PDF for Java,可以检测 PDF 中的表格结构,并通过少量代码实现自动化导出。

本文将逐步讲解如何在 Java 中完成 PDF 到 CSV 的转换——从环境搭建,到表格提取,再到处理多页文档或单页多表等复杂情况。

教程概览


Java PDF 转 CSV 的环境搭建

在使用 Java 提取表格并转换为 CSV 之前,需要先搭建开发环境。这包括选择合适的库并将其添加到项目中。

为什么选择 Spire.PDF for Java

由于 PDF 文件本身不支持直接导出为 CSV,因此通过代码提取表格是更现实的做法。Spire.PDF for Java 提供了检测 PDF 文档中表格结构并直接保存为 CSV 的 API,使转换过程更简单高效。

安装 Spire.PDF for Java

如果使用 Maven,可以添加以下配置:

<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.pdf</artifactId>
        <version>11.11.11</version>
    </dependency>
</dependencies>

如果没有使用 Maven,可以直接 下载 Spire.PDF for Java 安装包,并将 JAR 文件添加到项目的 classpath 中。

从 PDF 提取表格并保存为 CSV

将 PDF 转换为 CSV 最实用的方法就是表格提取。使用 Spire.PDF for Java,可以通过以下步骤完成:

  1. 加载 PDF 文档
  2. 使用 PdfTableExtractor 检测页面中的表格
  3. 按行收集单元格内容
  4. 将结果写入 CSV 文件

下面的 Java 示例展示了完整的转换流程:

Java 示例代码:PDF 转换为 CSV

import com.spire.pdf.*;
import com.spire.pdf.utilities.*;

import java.io.*;

public class PdfToCsvExample {
    public static void main(String[] args) throws Exception {
        // 加载 PDF 文档
        PdfDocument pdf = new PdfDocument();
        pdf.loadFromFile("Sample.pdf");

        // 用于存储提取文本的 StringBuilder
        StringBuilder sb = new StringBuilder();

        // 遍历每一页
        for (int i = 0; i < pdf.getPages().getCount(); i++) {
            PdfTableExtractor extractor = new PdfTableExtractor(pdf);
            PdfTable[] tableLists = extractor.extractTable(i);

            if (tableLists != null) {
                for (PdfTable table : tableLists) {
                    for (int row = 0; row < table.getRowCount(); row++) {
                        for (int col = 0; col < table.getColumnCount(); col++) {
                            // 安全处理 CSV 字段
                            String cellText = escapeCsvField(table.getText(row, col));
                            sb.append(cellText);

                            if (col < table.getColumnCount() - 1) {
                                sb.append(",");
                            }
                        }
                        sb.append("\n");
                    }
                }
            }
        }

        // 写入 CSV 文件
        try (Writer writer = new OutputStreamWriter(
                new FileOutputStream("output/PDFTable.csv"), "UTF-8")) {
            writer.write(sb.toString());
        }

        pdf.close();
        System.out.println("PDF 表格已成功导出为 CSV。");
    }

    // 处理 CSV 字段的工具方法
    private static String escapeCsvField(String text) {
        if (text == null) return "";

        // 去掉换行
        text = text.replaceAll("[\\n\\r]", "");

        // 特殊字符处理
        if (text.contains(",") || text.contains(";") || text.contains("\"") || text.contains("\n")) {
            text = text.replace("\"", "\"\"");  // 转义双引号
            text = "\"" + text + "\"";          // 添加引号
        }

        return text;
    }
}

代码讲解

  • PdfDocument:将 PDF 文件加载到内存
  • PdfTableExtractor:逐页检测表格
  • PdfTable:提供对行和列的访问
  • escapeCsvField():去掉换行并处理特殊字符
  • StringBuilder:拼接单元格内容,使用逗号分隔
  • 最终结果写入 Output.csv,可直接在 Excel 或任意编辑器中打开

运行代码后生成的 CSV 文件示例:

在 Java 中将 PDF 表格导出为 CSV 示例

处理复杂的 PDF 转 CSV 场景

实际应用中,PDF 文件常常包含多个表格、跨多页,或表格结构不规则。下面介绍如何应对这些情况。

1. 单页包含多个表格

extractTable(i) 返回的 PdfTable[] 包含该页中检测到的所有表格,可以将每个表单独保存为不同的 CSV 文件:

for (int i = 0; i < pdf.getPages().getCount(); i++) {
    PdfTableExtractor extractor = new PdfTableExtractor(pdf);
    PdfTable[] tableLists = extractor.extractTable(i);

    if (tableLists != null) {
        for (int t = 0; t < tableLists.length; t++) {
            PdfTable table = tableLists[t];
            StringBuilder tableContent = new StringBuilder();

            for (int row = 0; row < table.getRowCount(); row++) {
                for (int col = 0; col < table.getColumnCount(); col++) {
                    tableContent.append(escapeCsvField(table.getText(row, col)));
                    if (col < table.getColumnCount() - 1) {
                        tableContent.append(",");
                    }
                }
                tableContent.append("\n");
            }

            try (Writer writer = new OutputStreamWriter(
                    new FileOutputStream("output/Tables/Table_Page" + i + "_Index" + t + ".csv"), "UTF-8")) {
                writer.write(sb.toString());
            }
        }
    }
}

示例:将单页的多个表格导出为独立 CSV 文件:

在 Java 中将单页多个表格导出为 CSV

2. 跨页或大表格

如果表格跨越多页,可以逐页提取并 追加写入,以避免覆盖:

StringBuilder sb = new StringBuilder();

for (int i = 0; i < pdf.getPages().getCount(); i++) {
    PdfTableExtractor extractor = new PdfTableExtractor(pdf);
    PdfTable[] tables = extractor.extractTable(i);

    if (tables != null) {
        for (PdfTable table : tables) {
            for (int row = 0; row < table.getRowCount(); row++) {
                for (int col = 0; col < table.getColumnCount(); col++) {
                    sb.append(escapeCsvField(table.getText(row, col)));
                    if (col < table.getColumnCount() - 1) sb.append(",");
                }
                sb.append("\n");
            }
        }
    }
}

FileWriter writer = new FileWriter("MergedTables.csv");
writer.write(sb.toString());
writer.close();

示例:将跨多页的大表格合并为一个 CSV 文件:

在 Java 中将多页 PDF 表格合并为一个 CSV

3. 格式限制

CSV 只能存储纯文本,像合并单元格、字体、图片等格式会丢失。如果需要保留样式,可以导出为 Excel(.xlsx)。参考:在 Java 中将 PDF 表格导出为 Excel

4. CSV 特殊字符处理

在写入 CSV 时,逗号、分号、双引号、换行等特殊字符可能会破坏文件结构。 上述 Java 示例中的 escapeCsvField 方法可以去除换行并安全转义。

更复杂的场景下,可以使用 Spire.XLS for Java,通过简单的 Java 代码将表格数据写入 Excel,再将 Excel 工作表保存为 CSV,无需手动处理特殊字符。

也可以选择开源工具,例如 OpenCSVApache Commons CSV,它们同样能自动处理特殊字符并简化代码。

总结

在 Java 中将 PDF 转换为 CSV,本质上就是 提取表格并保存为结构化格式。CSV 文件轻量、通用,非常适合存储和分析表格数据。通过搭建 Spire.PDF for Java 环境并参考本文示例代码,即可实现自动化转换,减少手动操作并提高效率。

如需体验更多高级功能,可以 申请免费试用许可证。小型项目也可以使用 Free Spire.PDF for Java

常见问题

Q: 可以把 PDF 转换为 CSV 吗?

A: 可以。虽然图片和带格式的文本无法导出,但表格数据可以提取并保存为 CSV。

Q: 如何在 Java 中从 PDF 提取数据

A: 使用 Spire.PDF for Java 等 PDF 库,可以解析文档、检测表格并导出为 CSV 或 Excel。

Q: 最好的 PDF 转 CSV 工具是什么?

A: 对于 Java 开发者来说,Spire.PDF for Java 等代码级解决方案比手动转换工具更灵活高效。

Q: 如何使用 Java 将 PDF 转换为 Excel?

A: 步骤与导出 CSV 类似,不同之处在于将数据保存为 Excel 格式,以便支持更多功能。

Spire.PDF for .NET 11.8.7 现已发布。该版本支持设置从 PDF 转换的 SVG 文件的宽度和高度,同时修复了多个与文件格式转换和文本替换相关的错误。更多详情如下:

新功能:

问题修复:


获取 Spire.PDF 11.8.7 请点击:

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

Spire.Presentation for Python 10.8.1 已发布。该版本修复了几个在转换 PPTX 到图片和添加 SVG 文件时出现的问题。详情请查看下文。

问题修复:


获取Spire.Presentation for Python 10.8.1,请点击:

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

Python 将 CSV 转换为 Excel 的简单指南

当我们处理数据时,使用 CSV 文件很常见,但如果涉及到数据共享、可视化和大规模分析方面,Excel(XLSX)往往具有更多优势。本文将为你介绍如何使用 Python 转换 CSV 为 Excel,涵盖单个文件和批量转换两种方法。无论是需要自动生成报表,还是为后续分析做数据准备,都能通过本指南高效完成转换。

为什么要将 CSV 转换为 Excel?

由于 CSV 文件的结构较为简单,因此它在数据存储与交换中被广泛使用,但在格式设置、呈现效果和可用性方面存在不少限制。将 CSV 转换为 Excel 能带来多方面优势:

将 CSV 转换为 Excel 的优势

  • 更丰富的格式支持:Excel 提供字体、颜色、边框、单元格合并等多种格式设置,让数据更易阅读和展示。
  • 多工作表支持:CSV 只能包含单一工作表,而 Excel 文件可在同一文件中保存多个工作表,更适合处理大型数据集。
  • 内置公式与图表功能:可直接使用 Excel 公式、数据透视表和图表进行数据分析与可视化。
  • 更适合业务用户:Excel 是许多非技术用户的首选工具,便于数据共享与协作。

CSV 文件的局限性

  • 无样式和格式支持(仅限纯文本)。
  • 仅支持单工作表结构。
  • 容易出现编码问题(例如包含非英文字符时)。
  • 不适合大型数据集或复杂报表。如果你的工作流程涉及报表生成、数据分析或与他人共享数据,将 CSV 转换为 Excel 往往是更实用、更灵活的选择。

安装所需的 Python 库

本指南将使用 Spire.XLS for Python 来演示如何在 Python 中轻松转换 CSV 为 Excel,包括 .xlsx 和 .xls 格式。Spire.XLS 是一款功能强大且专业的 Python Excel 库,可在不依赖 Microsoft Excel 的情况下读取、编辑和转换 Excel 文件。

安装这个 CSV 转 Excel 工具非常简单,只需运行以下命令:

pip install Spire.XLS

此外,你也可以手动下载 Spire.XLS 安装包,进行自定义安装。

Python 将单个 CSV 文件转换为 Excel

接下来进入正题——如何在 Python 中将单个 CSV 文件转换为 Excel。有了 Spire.XLS,这个任务只需三步:创建新工作簿、加载 CSV 文件、将其保存为 Excel(.xlsx或.xls)文件。下面我们将结合完整代码示例为你详细讲解。

在 Python 中将单个 CSV 转换为 Excel 的步骤:

  • 创建一个 Workbook 实例。
  • 使用 Workbook.LoadFromFile() 方法加载示例 CSV 文件。
  • 通过 Workbook.SaveToFile() 方法将 CSV 保存为 Excel 文件。

下面的 Python 代码不仅实现了 CSV 转 Excel,还设置了忽略解析错误,并自动调整列宽以提升可读性:

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

# 创建一个 Workbook 对象
workbook = Workbook()

# 加载一个 CSV 文件
workbook.LoadFromFile("/input/人口土地.csv", ",", 1, 1)
  
# 设置忽略错误选项和自适应列宽
sheet = workbook.Worksheets[0]
sheet.Range["B2:D11"].IgnoreErrorOptions = IgnoreErrorType.NumberAsText
sheet.AllocatedRange.AutoFitColumns()  

# 将 CSV 文件保存为 Excel
workbook.SaveToFile("/output/CSV转Excel.xlsx", ExcelVersion.Version2013)
# 将 CSV 文件保存为.xls
#workbook.SaveToFile("/output/CSV转Excel11.xls", ExcelVersion.Version97to2003)

单个 CSV 文件转换为 Excel 结果文档预览: Python 将单个 CSV 转换为 XLSX

温馨提示: 如果你只是处理小文件或进行简单测试,也可以使用免费的 Spire.XLS 版本,它是一个不错的入门选择。

Python 批量将 CSV 转换为 XLSX

另一种常见需求是将多个 CSV 文件批量转换为 Excel。与其在代码中手动修改文件路径和文件名,不如用更高效的方式:只需将所有 CSV 文件放在同一文件夹中,然后用 Python 遍历文件并调用 Workbook.SaveToFile() 方法就能成功将文件夹中所有 CSV 文件一次性转换为 Excel 文件。

在 Python 中批量将 CSV 转换为 Excel 的步骤如下:

  • 指定输入文件夹和输出文件夹的路径。
  • 遍历输入文件夹中的所有 CSV 文件。
  • 创建一个 Workbook 类的对象。
  • 使用 Workbook.LoadFromFile() 方法加载输入文件夹中的每个 CSV 文件。
  • 调用 Workbook.SaveToFile() 方法将当前 CSV 文件保存为 Excel 文件。

下面的 Python 代码示例演示了如何批量将 CSV 转换为 Excel(.XLSX):

import os
from spire.xls import *

input_folder = r"/input/CSV"
output_folder = r"/output/BatchConversion"

# 遍历所有 CSV 文件
for csv_file in os.listdir(input_folder):
    if csv_file.endswith(".csv"):
        input_path = os.path.join(input_folder, csv_file)
        output_name = os.path.splitext(csv_file)[0] + ".xlsx"
        output_path = os.path.join(output_folder, output_name)

        # 创建 Workbook 实例并加载 CSV 文件
        workbook = Workbook()
        workbook.LoadFromFile(input_path, ",", 1, 1)

        # 将每个 CSV 文件保存为 Excel 文件
        workbook.SaveToFile(output_path, ExcelVersion.Version2013)

下方是批量转换 CVS 为 Excel 文件的结果预览: Python 批量转换多个 CSV 文件为 Excel

总结

本文通过分步讲解与完整代码示例,演示了如何在 Python 中将 CSV 转换为 Excel。无论是处理单个 CSV 文件,还是批量转换多个文件,Spire.XLS 都能让整个过程变得简单、高效、无忧。 如果你需要应对更复杂的场景,或处理其他与 Excel 相关的任务,欢迎随时该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取免费 30 天试用授权!

CSV 转 Excel 常见问题解答

Q1:如何在 Python 中不使用 pandas 将 CSV 转换为 Excel?

A:你可以使用 Spire.XLS、openpyxl 或 xlsxwriter 等库来实现,无需依赖 pandas。这些工具提供了简单的 API 来加载 .csv 文件并导出为 .xlsx,而且不需要安装 Microsoft Excel。

Q2:在 Python 中批量将多个 CSV 文件转换为 Excel 最简单的方法是什么?

A:将所有 CSV 文件放到同一个文件夹中,然后在 Python 中遍历这些文件,并使用 Workbook.SaveToFile() 方法逐一转换即可。这种方式非常适合批量处理。对于偶尔转换的情况,也可以使用在线转换工具。

Q3:如何在 CSV 转 Excel 时自动调整列宽?

A:加载 CSV 文件后,在保存 Excel 之前调用 Spire.XLS 的 Worksheet.AutoFitColumns() 方法,就能根据内容自动调整列宽。

Spire.XLS 15.8.3 现已正式发布。该版本新增支持 FORMULATEXT 函数和 PDURATION 函数。同时,一些在 Excel 转换、保存文档、处理透视表以及插入数据时的样式保留等方面出现的问题也得以成功修复。详情如下:

新功能:

问题修复:


获取 Spire.XLS 15.8.3 请点击:

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

在日常开发中,在 Python 中读取 CSV 文件是数据处理、数据分析和后端集成场景中的常见任务。虽然 Python 自带 csv 和 pandas 等内置模块来处理 CSV 文件,但 Spire.XLS for Python 作为一款功能强大的库,能更高效地实现 CSV 与 Excel 文件的程序化操作,为复杂需求提供更优解。

本文将介绍如何使用 Python 读取 CSV 文件,内容涵盖从基础的 CSV 解析到高级处理技巧:

Spire.XLS for Python 简介

Spire.XLS for Python 是一款专注于 Excel 与 CSV 处理的全能库,相比 Python 原生 CSV 解析工具,它的核心优势的在于:

  • 极简 API 设计,支持 CSV 数据的加载、读取与修改
  • 灵活兼容各类分隔符,轻松应对非标准 CSV 文件
  • 双向格式转换:可将 CSV 转 Excel(XLSX/XLS),也能将 Excel 转 CSV

无论是数据分析师处理结构化数据,还是开发人员搭建数据流转功能,这款库都能显著提升效率。

通过 pip 快速安装

开始使用前,需要先通过 pip 命令安装该库。它支持 Python 3.6 及以上版本,兼容 Windows、macOS、Linux 系统:

pip install Spire.XLS

基础示例:用 Python 读取 CSV 文件

先从简单场景入手:解析 CSV 文件并提取数据。假设我们有一份名为 “示例.csv” 的文件,内容如下:

姓名,年龄,职务,入职日期
李华,30,工程师,2020/3/18
孙东,28,运维,2022/11/9
张莉,25,财务,2023/1/27

Python 读取 CSV 的完整代码

以下 Python 代码可实现 CSV 文件的加载与数据提取:

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

# 创建 Workbook 对象
workbook = Workbook()

# 加载 CSV 文件
workbook.LoadFromFile("示例.csv", ",", 1, 1)

# 获取第一个工作表(CSV 文件默认加载为单个工作表)
worksheet = workbook.Worksheets[0]

# 获取包含数据的行数和列数
row_count = worksheet.LastRow 
col_count = worksheet.LastColumn 

# 遍历行和列,打印数据
print("CSV 数据:")
for row in range(row_count):
    for col in range(col_count):
        # 获取单元格值
        cell_value = worksheet.Range[row+1, col+1].Value
        print(cell_value, end="\t")
    print()  # 每行结束后换行

# 关闭工作簿,释放资源
workbook.Dispose()

代码说明

  • 工作簿初始化:Workbook 是操作 Excel/CSV 文件的核心类,所有文件处理都基于该对象展开。。
  • 加载 CSV 文件:LoadFromFile()方法用于导入 CSV 数据,其参数如下:
    • fileName:待读取的 CSV 文件路径。
    • separator:文件使用的分隔符(例如 “,”)。
    • row/column:起始读取行 / 列索引(从 1 开始计数)。
  • 访问工作表:CSV 数据会加载到第一个工作表中。
  • 读取数据:通过遍历行和列,借助worksheet.Range[].Value 来提取单元格的值。

输出结果: 程序会在控制台以制表符分隔的格式,清晰打印出 CSV 文件中的所有数据。

Python 读取 CSV 文件

进阶技巧:优化 CSV 读取体验

1. 使用自定义分隔符读取 CSV 文件

很多场景下 CSV 不会用逗号分隔(比如用分号 “;”、制表符 “\t”),此时只需在加载文件时指定对应分隔符即可。例如读取以分号为分隔符的 CSV:

# 加载 CSV 文件
workbook.LoadFromFile("input.csv", ";", 1, 1)

2. 跳过表头

要在你的 CSV 文件中跳过表头(第一行),只需调整行迭代逻辑,让循环从第二行开始执行即可。

for row in range(1, row_count): 
    for col in range(col_count):
        # 获取单元格值(Spire.XLS 对表格的索引从 1 开始,需在循环变量基础上加1)
        cell_value = worksheet.Range[row+1, col+1].Value
        print(cell_value, end="\t")

3. Python 将 CSV 转换为 Excel

Spire.XLS 的核心亮点之一,就是能将 CSV 快速转为 Excel 格式,并支持 Excel 的各类高级功能。转换后可实现:

  • 美化格式:设置单元格颜色、添加边框、调整字体
  • 数据可视化:插入柱状图、折线图等图表
  • 便捷分享:保存为通用的 XLSX 格式,兼容主流办公软件

转换教程:在 Python 中将 CSV 转换为 Excel

文章总结

借助 Spire.XLS for Python 处理 CSV 文件,无论是基础的数据读取,还是自定义分隔符、格式转换等进阶需求,都能以简洁的代码实现。这套方案不仅降低了开发难度,还能兼容各类复杂场景,非常适合集成到数据处理项目中。

若需探索更多高级功能(如 Excel 公式计算、数据筛选),可参考 Spire.XLS for Python 官方文档获取详细教程。

Spire.XLS for Java 15.8.3 现已正式发布。该版本支持在转换Excel到HTML时保留批注,同时修复了Excel转PDF、列宽及HTML转换等多个问题。更多详情如下。

新功能:

问题修复:


获取 Spire.XLS for Java 15.8.3 请点击:

Spire.XLS for Java 下载页面

使用 C# 实现字节串和PDF之间的转换

在 C# 开发中,处理 PDF 的字节数组是一种常见需求。开发者常常需要将 PDF 文档存储到数据库、通过 API 传输,或者完全在内存中进行处理而不依赖文件系统。在这些场景下,在 C# 中实现 PDF 与字节数组的互转 就显得尤为重要。

本文将通过 Spire.PDF for .NET 演示具体实现步骤。你将学习如何将字节数组转换为 PDF,如何将 PDF 转换为字节数组,以及如何直接在内存中使用 C# 代码编辑 PDF。

快速导航

为什么在 C# 中要处理 PDF 与字节数组?

使用 byte[] 作为传输格式,可以避免生成临时文件,使代码更适配云环境和容器环境。

  • 数据库存储 (BLOB): 将 PDF 以原始字节形式存储,仅在需要时加载。
  • Web API: 通过 HTTP 发送或接收 PDF,无需磁盘读写。
  • 内存处理: 在流中完成 PDF 的转换或加水印操作。
  • 安全与隔离: 减少文件 I/O,降低临时文件风险。

准备工作: 在运行示例前,请先在项目中安装 Spire.PDF for .NET 的 NuGet 包。

Install-Package Spire.PDF

安装完成后,即可通过 byte[]Stream 加载 PDF,编辑页面,并将结果写回内存或磁盘,无需额外转换器。

在 C# 中将字节数组转换为 PDF

当上游服务(如 API 或消息队列)传递一个代表 PDF 的 byte[] 时,通常需要将其还原为文档,便于进一步处理或保存到磁盘。使用 Spire.PDF for .NET,这个过程可以直接在内存中完成,无需中间临时文件。

应用场景与方法: 从数据库或 API 获取一个 byte[],在内存中构建 PdfDocument,可选地验证一些基础信息,然后保存为 PDF。

using Spire.Pdf;
using System.IO;

class Program
{
    static void Main()
    {
        // 示例来源:从数据库或 API 获取的字节数组
        byte[] pdfBytes = File.ReadAllBytes("Sample.pdf"); // 请替换为实际数据来源

        // 1) 从字节数组加载 PDF(内存中完成)
        PdfDocument doc = new PdfDocument();
        doc.LoadFromBytes(pdfBytes);

        // 2) (可选)在保存或处理前查看文档信息
        // int pageCount = doc.Pages.Count;

        // 3) 保存为文件
        doc.SaveToFile("Output.pdf");
        doc.Close();
    }
}

下图展示了字节数组到 PDF 的转换流程:

bytes loaded into PdfDocument and saved as PDF in C# with Spire.PDF

代码解析:

  • LoadFromBytes(byte[]) 可直接在内存中初始化 PDF,适合无写入权限的服务环境。
  • 加载完成后可以进行多种操作:验证页面、打码、加盖印章或路由到其他流程。
  • SaveToFile(string) 将文档保存到磁盘,便于后续处理或存储。

在 C# 中将 PDF 转换为字节数组

反向转换时,将 PDF 转换为 byte[] 便于写入数据库、缓存,或通过 HTTP 响应返回文件。Spire.PDF for .NET 支持将 PDF 保存到 MemoryStream,再通过 ToArray() 转换为字节数组。

应用场景与方法: 加载现有 PDF,将其保存到 MemoryStream,再提取 byte[]。这种方式特别适用于 API 返回 PDF 或持久化存储。

using Spire.Pdf;
using System.IO;

class Program
{
    static void Main()
    {
        // 1) 从磁盘、网络或资源文件加载 PDF
        PdfDocument doc = new PdfDocument();
        doc.LoadFromFile("Input.pdf");

        // 2) 保存到内存流,避免生成临时文件
        byte[] pdfBytes;
        using (var ms = new MemoryStream())
        {
            doc.SaveToStream(ms);
            pdfBytes = ms.ToArray();
        }

        doc.Close();

        // pdfBytes 现在包含完整文档(可直接写入数据库或 API 返回)
        // 示例:return File(pdfBytes, "application/pdf");
    }
}

下图展示了 PDF 转换为字节数组的流程:

PDF loaded into PdfDocument, saved to MemoryStream, then bytes in C#

关键点总结:

  • SaveToStream → ToArray 是在 C# 中获取 PDF 字节的标准方式,无需生成临时文件。
  • 这种方法适合大文件处理,内存使用量仅受限于系统资源。
  • ASP.NET 中尤其实用,可直接返回字节数组给前端或 API 调用方。

直接从字节数组创建和编辑 PDF

更强大的场景是直接在内存中编辑 PDF。你可以从 byte[] 加载 PDF,添加文字或图片、加水印、填写表单,再将结果保存为新的 byte[]。这种无文件管道非常适合微服务。

应用场景与方法: 从字节数组加载 PDF,在第一页添加文字标记,最后输出新的字节数组。

using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
using System.IO;

class Program
{
    static void Main()
    {
        // 来源可以是数据库、API 或文件,这里用 byte[] 表示
        byte[] inputBytes = File.ReadAllBytes("Input.pdf");

        // 1) 内存加载 PDF
        var doc = new PdfDocument();
        doc.LoadFromBytes(inputBytes);

        // 2) 编辑:在第一页写入一个小标记
        PdfPageBase page = doc.Pages[0];
        page.Canvas.DrawString(
            "编辑后的PDF文档",
            new PdfTrueTypeFont(new Font("HarmonyOS Sans SC", 26f), true),
            PdfBrushes.DarkBlue,
            new PointF(100, page.Size.Height - 100)
        );

        // 3) 保存为新的字节数组
        byte[] editedBytes;
        using (var ms = new MemoryStream())
        {
            doc.SaveToStream(ms);
            editedBytes = ms.ToArray();
        }

        doc.Close();

        // editedBytes 可持久化存储或由 API 返回
    }
}

下图展示了编辑后的 PDF 页面:

Edited PDF page with insrted text using C# in bytes

要点说明:

  • 同样的方式可应用于 文本、图片、水印、批注、表单字段 等编辑操作。
  • 建议保持操作幂等(如检查是否已加盖印章),避免重复处理。
  • 在 ASP.NET 中非常适合 即时加印条件脱敏,再返回给调用方。

如果你想学习如何从零创建 PDF,可以参考我们的文章:在 C# 中创建 PDF 文档

使用 Spire.PDF for .NET 的优势

下表总结了该 API 在字节数组处理中的优势:

需求点 Spire.PDF for .NET 的优势
I/O 灵活性 同一个 PdfDocument API 支持从文件路径、Streambyte[] 加载与保存
内存编辑 可绘制文本/图片、管理批注/表单、添加水印等,无需临时文件
服务友好 轻松集成到 ASP.NET 接口和后台任务
处理真实文档 支持多页 PDF,可通过流控制内存消耗
代码简洁 避免手动字节操作和复杂互操作,简化实现

总结

本文演示了如何在 C# 中 将字节数组转换为 PDF、如何 将 PDF 转换为字节数组,以及如何 直接在内存中编辑 PDF。通过流和字节数组操作,可以让 API 设计更简洁、响应更高效,同时兼顾数据库和云环境的适配性。Spire.PDF for .NET 提供了一套一致的无文件化工作流,既适合快速转换,也能扩展为完整的内存文档处理。

如果你想在无功能限制的情况下体验这些特性,可以申请 30 天免费临时授权。或者,你也可以试用 Free Spire.PDF for .NET,适合轻量级 PDF 任务。

常见问题

可以在不保存到磁盘的情况下,通过字节数组创建 PDF 吗?

可以。使用 LoadFromBytesbyte[] 加载 PDF,然后保存到 MemoryStream 或直接在 API 中返回,无需落盘。

如何在 C# 中将 PDF 转换为字节数组以便存入数据库?

使用 PdfDocument.SaveToStream 方法,并调用 MemoryStream.ToArray() 获取字节数组,再存储为 BLOB 或传递给其他服务。

能否编辑仅存在于字节数组中的 PDF?

完全可以。先通过字节数组加载 PDF,再进行文字、图片、水印、批注或表单填写等编辑,最后保存为新的 byte[]

有哪些性能与可靠性建议?

及时释放流、在合适的场景重用缓冲区、每个操作/线程单独创建 PdfDocument。对于大文件,建议使用流式 I/O 控制内存使用,保证可预测性。