@mertdeveci55/univer-进口-出口
强大的Excel/CSV进出口库 毕业 带有完整格式保存的电子表格,包括公式、样式、图表和有条件的格式.
特征
✅ 导入支持
- Excel 文件 (. xlsx, . xls)
- CSV 文件 (.csv)
- 保存全部工作表(包括空工作表)
- 处理工作表名称中的特殊字符( 等)
- 维持精确的工作表顺序
- 完全样式保存( 字体、 颜色、 边框、 校正)
- 公式和计算值保留(包括TRANSOSE和数组公式)
- 合并单元格支持
- 图像和图表
- 有条件的格式
- 数据验证
- 超链接和丰富文本
✅ 导出支持
- Excel 文件 (.xlsx) (中文(简体) )
- CSV 文件 (.csv)
- 完整格式保存
- 公式导出
- 命名范围
- 多个工作表
安装
npm install @mertdeveci55/univer-import-export
或者说
yarn add @mertdeveci55/univer-import-export
使用量
导入 Excel 到 Univer
import { LuckyExcel } from '@mertdeveci55/univer-import-export';
// Handle file input
const fileInput = document.getElementById('file-input');
fileInput.addEventListener('change', (e) => {
const file = e.target.files[0];
LuckyExcel.transformExcelToUniver(
file,
(univerData) => {
// Use the Univer data
console.log('Converted data:', univerData);
// Create Univer instance with the data
univer.createUnit(UniverInstanceType.UNIVER_SHEET, univerData);
},
(error) => {
console.error('Import error:', error);
}
);
});
导入 CSV 到 Univers
import { LuckyExcel } from '@mertdeveci55/univer-import-export';
LuckyExcel.transformCsvToUniver(
csvFile,
(univerData) => {
// Use the converted CSV data
univer.createUnit(UniverInstanceType.UNIVER_SHEET, univerData);
},
(error) => {
console.error('CSV import error:', error);
}
);
导出大学到 Excel
import { LuckyExcel } from '@mertdeveci55/univer-import-export';
// Get Univer snapshot
const snapshot = univer.getActiveWorkbook().save();
LuckyExcel.transformUniverToExcel({
snapshot: snapshot,
fileName: 'my-spreadsheet.xlsx',
success: () => {
console.log('Export successful');
},
error: (err) => {
console.error('Export error:', err);
}
});
导出大学到 CSV
import { LuckyExcel } from '@mertdeveci55/univer-import-export';
const snapshot = univer.getActiveWorkbook().save();
LuckyExcel.transformUniverToCsv({
snapshot: snapshot,
fileName: 'my-data.csv',
sheetName: 'Sheet1', // Optional: specific sheet to export
success: () => {
console.log('CSV export successful');
},
error: (err) => {
console.error('CSV export error:', err);
}
});
API 参考
LuckyExcel.transformExcelToUniver(file, callback, errorHandler)
将 Excel 文件转换为 Univers 格式.
- 文件数字 :
File- Excel文件(.xlsx或.xls) - 回调数字 :
(data: IWorkbookData) => void- 使用转换数据成功召回 - 处理错误数字 :
(error: Error) => void- 回调错误
LuckyExcel.transformCsvToUniver(file, callback, errorHandler)
将 CSV 文件转换为 Univers 格式.
- 文件数字 :
File- CSV档案 - 回调数字 :
(data: IWorkbookData) => void- 成功回电 - 处理错误数字 :
(error: Error) => void- 回调错误
LuckyExcel.transformUniverToExcel(params)
导出 Univers 数据到 Excel 文件 .
参数对象:
- 简介数字 :
any- 大学手册快照 - 文件Name数字 :
string- 输出文件名(可选,默认:excel_[timestamp].xlsx(中文(简体) ) - 获取缓冲数字 :
boolean- 返回缓冲器而不是下载(可选,默认:虚假) - 成功数字 :
(buffer?: Buffer) => void- 成功回电 - 错误数字 :
(err: Error) => void- 回调错误
LuckyExcel.transformUniverToCsv(params)
导出 Univer 数据到 CSV 文件 .
参数对象:
- 简介数字 :
any- 大学手册快照 - 文件Name数字 :
string- 输出文件名(可选,默认:csv_[timestamp].csv(中文(简体) ) - 工作表Name数字 :
string- 要导出的特定工作表(如果未具体说明,则全部出口) - 获取缓冲数字 :
boolean- 返回内容而不是下载(可选,默认:虚假) - 成功数字 :
(content?: string) => void- 成功回电 - 错误数字 :
(err: Error) => void- 回调错误
浏览器支持
该库在所有支持的现代浏览器中工作:
- ES6 + 标准
- 文件 API
- Blob API 软件
项目结构
src/
├── ToLuckySheet/ # Excel → LuckySheet conversion
│ ├── LuckyFile.ts # Main file orchestrator - handles sheet discovery
│ ├── LuckySheet.ts # Individual sheet processor
│ ├── ReadXml.ts # XML parser with special character escaping
│ ├── LuckyCell.ts # Cell data processor
│ └── ...
├── LuckyToUniver/ # LuckySheet → Univer conversion
│ ├── UniverWorkBook.ts # Workbook structure converter
│ ├── UniverSheet.ts # Sheet data converter
│ └── ...
├── UniverToExcel/ # Univer → Excel export
│ ├── Workbook.ts # Excel workbook builder using ExcelJS
│ └── ...
├── HandleZip.ts # ZIP file operations using JSZip
└── main.ts # Entry point with public API
dist/ # Built output (ESM, CJS, UMD formats)
publish.sh # Automated publishing script
gulpfile.js # Build configuration
CLAUDE.md # Detailed technical documentation
关键执行细节
特殊字符处理
有特殊字符的工作表名称( 如 >>>(a) 通过下列机制处理: src/ToLuckySheet/ReadXml.ts数字 :
// Escapes ">" to "__GT__" before XML parsing
escapeXmlAttributes(xmlString)
// Restores "__GT__" back to ">" after parsing
unescapeXmlAttributes(xmlString)
空工作表保存
所有工作表在导入时都会被保存, 即使是完全空的 。 这保持了Excel文件结构的完整性.
公式支持
综合公式支持,包括:
- 标准公式(SUM、AVERAGE、IF、VLOOKUP等)
- 矩阵公式
- 带有正确数组处理的 TransactionPOSE 公式
- 共享公式
- 命名区域引用
发展
大楼
npm install
npm run build # Uses gulp to compile TypeScript and bundle
出版
总是使用发布脚本发布 :
./publish.sh
此脚本 :
- 构建工程
- 增量版本
- 提交更改
- 推进到 GitHub
- 发布到 npm
测试
npm test
密钥改进
v0.1.40 (最晚) - 简化了导出系统
- Excel 兼容性: 完全取消Excel恢复警告
- 手术后处理: 保存所有数据完整性的保守后端修正
- 生产安全: 恢复导致腐败的实验性修正
- 文档: 全面记录剩余的限制和工作变通办法
v0.1.39 - 后端集成
- opyxl 集成: ExcelJS限制的完整后端处理系统
- 定义名称修正: 使用 Python/ Django 后端对命名区域进行完整解析
- 双模式导出: 前端 + 后端导出自动倒置
v0.1.24 - 核心稳定性
- 特殊字符支持: 处理工作表名称
>>>和其他特殊人物通过逃脱/逃脱机制 - 空工作表保存: 导入时从未跳出空工作表
- 无硬码解决方案: 删除所有硬码工作表添加 - 所有解决方案都是通用的
- 工作表顺序: 维护原始文件的精确工作表顺序
- 样式保存: 完整样式映射,包括粗体、斜体、颜色、边框
- 公式处理: 保留公式和计算值,包括TRANSOSE
- XLS 支持: 将.xls文件自动转换为.xlsx格式
- 更好的错误处理: 综合错误信息和详细记录
依赖关系
核心依赖关系
@progress/jszip-esm- Excel 文件的 ZIP 文件处理@zwight/exceljs- Excel文件结构(导出)@univerjs/core- 通用核心类型和接口dayjs- 对Excel日期进行日期操纵papaparse- CSV分析xlsx- 额外的Excel格式支持
构建依赖
gulp- 构建管弦乐rollup- 模块捆绑typescript- 类型安全terser- 消化(配置为保存控制台.logs)
相关项目和参考文献
核心依赖关系
执行实例
- α 前端 - 生产实施
- 见:
src/utils/excel-import.ts例如使用时 - 见:
src/pages/SpreadsheetsPage.tsx用于UI 整合
- 见:
文档
- 克劳德·姆德 - 人工智能助理的详细技术文件
- 发布.sh - 自动出版脚本
- gulpfile.js (英语) - 构建配置
已知问题和解决方案
解决的问题
| 问题 | 解决方案 | 版本已固定 |
|---|---|---|
| 带有特殊字符 (QQ) 不导入的工作表 | ReadXml.ts中的逃逸/逃逸机制 | v. 1.123+ 维基月球 |
| 属性列表未定义错误 | 防御性初始化 | 页:1 |
| 出现复制页 | 删除了硬码工作表添加 | (单位:千分之一) |
| TRANSOSE 公式无效 | 矩阵公式支持 | v. 1.18+ (中文(简体) ) |
| 不导入边框样式 | 在 UniversWorkBook 中添加样式收藏 | 页:1 |
导出限制和解决方案
由于基础的ExcelJS库的限制,一些高级的Excel功能在其中存在问题 导出然而,我们提供了全面的解决办法:
🔧 后端处理后解决方案
对于生产应用,我们建议使用后端后处理来实现 100% Excel 兼容性数字 :
建筑
Frontend Export → Backend API → openpyxl Post-Processing → Fixed Excel File
Django 整合示例
from spreadsheets.import_export import UniverToExcelConverter, ExcelPostProcessor
# Step 1: Export with existing functionality (preserves all working features)
converter = UniverToExcelConverter()
excel_buffer = converter.convert(univer_data)
# Step 2: Apply surgical fixes for ExcelJS limitations
post_processor = ExcelPostProcessor()
fixed_buffer = post_processor.process_excel_buffer(
excel_buffer.getvalue(),
univer_data
)
获得什么固定
- ✅ 定义名称: 所有命名的区域在 Excel 中完美工作
- ✅ 矩阵公式属性: 溢出范围的适当 XML 属性
- ✅ Excel 365 兼容性: 充分支持现代 Excel 特性
- ✅ 业绩: ~7ms 处理间接费用
- ✅ 安全问题: 保存所有现有的功能
前端整合
// Enhanced export with backend post-processing
const result = await exportToExcel({
workbookData,
fileName: 'spreadsheet.xlsx',
useBackendExport: true, // Enable backend processing
enablePostProcessing: true, // Fix ExcelJS limitations
exportSpreadsheetToExcel: api.exportSpreadsheetToExcel
});
// Automatic fallback to frontend if backend unavailable
if (result.stats?.postProcessingApplied) {
console.log('✅ Enhanced Excel compatibility applied!');
}
设置要求
- Python 后端 与
openpyxl已安装 - API 终点 用于后处理
- 可选: 逐步推出的地物旗
📊 当前出口状况(v0.1.40)
✅ 完全工作特征
- ✅ Excel 兼容性: 打开文件而无需恢复警告
- ✅ 数据完整性: 保存完好的公式、值和结构
- ✅ 命名范围: 所有定义的名称都在 Excel 中正确工作(固定在后端)
- ✅ 进口业务:为所有 Excel 特性保留100%的功能
⚠️ 已知的视觉/演示问题
| 问题 | 影响 | 状态 | 工作周边 |
|---|---|---|---|
| 翻译@ 符号 | 公式显示 =@TRANSPOSE(@$N$43:$N$45) | 只化妆 - 计算工作 | 文件为已知问题 |
| 边框样式变化 | 破旧的边界可能会变得坚固 | 仅视觉造型 | 导入中保存的原始设计 |
| ExcelJS 核心限制 | 不支持一些高级 Excel 特性 | 图书馆限制 | 使用后端处理 |
🔧 后端后处理( 建议)
状态: 生产准备外科修复,以达到最大限度的Excel相容性.
它能解决什么数字 :
- QQ 完全删除 Excel 恢复警告
- QQ 确保所有命名区域完美工作
- * 保持100%的数据完整性和公式准确性
无法修复的东西(按设计)数字 :
- QQ 翻译 @ 符号( 需要 ExcelJS 核心更改)
- QQ 边框样式不一致( 需要 ExcelJS 改进)
业绩: ~7ms 为完全Excel相容性而进行高通.
导入功能效果完美 - 这些限制只影响出口业务.
捐款
欢迎捐款! 请确保:
- 无硬码解决方案 - 所有修正必须通用
- 广泛伐木 - 为调试添加控制台.log
- 使用发布.sh - 从不手工发布到npm
- 测试边缘大小写 - 包括特殊字符、空工作表
- 遵循现有模式 - 请检查date=中的日期值 (帮助)
许可证
麻省理工学院
贷项
支助
对于问题和专题请求: