Skip to content

AquaBreeze

Menu
  • 範例頁面
Menu

解决方案:当 Excel 数据超过 200 万行时,如何转换为 SQLite 并在软件中方便编辑(完整流程与实践建议)

Posted on 2025 年 9 月 22 日2025 年 9 月 22 日 by root

解决方案:当 Excel 数据超过 200 万行时,如何转换为 SQLite 并在软件中方便编辑(完整流程与实践建议)

Excel 单文件行数和内存限制常常使得超大表格不可直接在 Excel 中编辑。把海量表格数据转成 SQLite 数据库,是既稳健又便于查询/编辑/分享的常见方案。下面给出一篇从思路到实操的完整方案,包含:预处理 → 导出 CSV → 高效导入 SQLite → 数据库设计与性能调优 → 在 GUI/脚本中编辑 → 导出回 Excel(分片)— 并附上实用命令与脚本示例。


一、整体思路(为什么选 SQLite)

  • SQLite 是单文件、零配置、跨平台、查询(SQL)能力强且生态丰富(很多 GUI 与库支持)。
  • 把超大表格放进 SQLite:避免 Excel 的内存/行数限制;适合做筛选/聚合/增删改查。
  • 可用轻量级 GUI(DB Browser for SQLite / DBeaver / SQLiteStudio / VSCode 插件)对表格进行所见即所得编辑,也可用脚本批量处理。
  • 数据回传到 Excel 时,按用户需要导出为多个分片 XLSX/CSV,使每个文件可在 Excel 中打开和编辑。

二、准备与先决步骤(数据清洗与分块)

  1. 原始文件形式:若原数据原本是多个小 Excel 文件,优先把它们统一导出为 CSV(UTF-8,或按需要的编码)。

  2. 如果只有一个超大 Excel 文件:建议先用工具把它转为 CSV(或用 Python openpyxl 的 streaming 写入),避免一次性读入内存。

  3. 必须清洗的项(预处理):

    • 统一列名(去空格、特殊字符,转小写)。
    • 处理分隔符、嵌套换行、引号等 CSV 问题。
    • 把复杂列(JSON/数组)考虑做二级表或文本列。
  4. 分块导出:按 X 万行分片写成多个 CSV(例如每 200k 行一个文件),便于导入和出错恢复。


三、把 CSV 导入 SQLite:方法与性能技巧

方法 A:sqlite3 CLI 的 .import

sqlite3 bigdata.db
.mode csv
.separator ,
PRAGMA journal_mode = WAL;
PRAGMA synchronous = OFF;
CREATE TABLE records (
  id INTEGER PRIMARY KEY,
  order_id TEXT,
  customer TEXT,
  amount REAL,
  created_at TEXT
);
.import part_001.csv records
.import part_002.csv records
CREATE INDEX idx_order_id ON records(order_id);

方法 B:Python 流式导入

import sqlite3, csv
conn = sqlite3.connect('bigdata.db')
cur = conn.cursor()
cur.execute("PRAGMA journal_mode=WAL;")
cur.execute("PRAGMA synchronous=OFF;")
cur.execute("""
CREATE TABLE IF NOT EXISTS records (
  order_id TEXT,
  customer TEXT,
  amount REAL,
  created_at TEXT
)
""")
insert_sql = "INSERT INTO records(order_id, customer, amount, created_at) VALUES (?,?,?,?)"
with open("part_001.csv", newline='', encoding='utf-8') as f:
    reader = csv.reader(f)
    header = next(reader)
    batch = []
    for i,row in enumerate(reader,1):
        batch.append((row[0], row[1], float(row[2] or 0), row[3]))
        if i % 10000 == 0:
            cur.executemany(insert_sql, batch)
            conn.commit()
            batch = []
    if batch:
        cur.executemany(insert_sql, batch)
        conn.commit()
conn.close()

方法 C:sqlite-utils / csvs-to-sqlite

pip install sqlite-utils
sqlite-utils insert bigdata.db records part_001.csv --csv


四、数据库设计与优化

  • 字段与索引:常用过滤/排序列加索引,导入完成后再建索引。
  • 分表策略:按时间或业务维度拆表。
  • 事务与批量操作:始终用 BEGIN; ... COMMIT; 包裹写入。
  • 全文索引:需要时使用 FTS5。

五、性能调优

  • 导入时:PRAGMA synchronous=OFF; journal_mode=WAL;。
  • 批量插入:用 executemany,分批提交。
  • 导入后:ANALYZE; VACUUM;。
  • 延迟建索引:导入完再建。

六、编辑数据的软件选择

  • 桌面 GUI:DB Browser for SQLite、SQLiteStudio、DBeaver、VSCode 插件。
  • Web 工具:Datasette、sqlite-web。
  • 脚本化编辑:Python 脚本批量修改。

七、导出回 Excel(分片)

Excel 单表限制 ~1,048,576 行。需分片导出:

import sqlite3, math
from openpyxl import Workbook

conn = sqlite3.connect("bigdata.db")
cur = conn.cursor()
count = cur.execute("SELECT COUNT(*) FROM records").fetchone()[0]
chunk_size = 800000
pages = math.ceil(count / chunk_size)

for p in range(pages):
    offset = p * chunk_size
    cur2 = conn.execute(f"SELECT order_id, customer, amount, created_at FROM records LIMIT {chunk_size} OFFSET {offset}")
    wb = Workbook(write_only=True)
    ws = wb.create_sheet()
    ws.append(["order_id","customer","amount","created_at"])
    for row in cur2:
        ws.append(row)
    wb.save(f"export_part_{p+1:02d}.xlsx")

conn.close()


八、并发与备份

  • SQLite 写操作串行,WAL 模式提升并发读。
  • 多人协同写入建议搭建 API 服务或迁移 Postgres。
  • 变更前文件备份 .db。

九、常见问题

  • Excel 样式/公式丢失:另存元数据或保留计算值。
  • 高并发写入:不适合 SQLite,需上服务器数据库。
  • 多人协作:用 Web 服务中转,而非直接共享 .db。

十、总结

  • 超过 200 万行 Excel 数据 → 转换 CSV → 导入 SQLite。
  • 导入时调优 PRAGMA、分批导入,导入后建索引。
  • 编辑用 GUI 或脚本结合。
  • 导出时分片,确保 Excel 可正常打开。
  • 多人写入/高并发场景需考虑更高级数据库。

發佈留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

近期文章

  • GPU 推理 vs CPU 推理:算力、时间与生态
  • AI 家居全面解析
  • HeidiSQL vs DBeaver 深度对比分析
  • 解决方案:当 Excel 数据超过 200 万行时,如何转换为 SQLite 并在软件中方便编辑(完整流程与实践建议)

近期留言

尚無留言可供顯示。

彙整

  • 2025 年 9 月

分類

  • 未分類
© 2025 AquaBreeze | Powered by Superbs Personal Blog theme