解决方案:当 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 中打开和编辑。
二、准备与先决步骤(数据清洗与分块)
-
原始文件形式:若原数据原本是多个小 Excel 文件,优先把它们统一导出为 CSV(UTF-8,或按需要的编码)。
-
如果只有一个超大 Excel 文件:建议先用工具把它转为 CSV(或用 Python openpyxl 的 streaming 写入),避免一次性读入内存。
-
必须清洗的项(预处理):
- 统一列名(去空格、特殊字符,转小写)。
- 处理分隔符、嵌套换行、引号等 CSV 问题。
- 把复杂列(JSON/数组)考虑做二级表或文本列。
-
分块导出:按 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 可正常打开。
- 多人写入/高并发场景需考虑更高级数据库。