UNPKG

xlsx-to-json-img

Version:

Convert Excel (.xlsx) to JSON with embedded images as Base64. Supports custom column mapping.

271 lines (232 loc) 8.43 kB
# excel 导入图片 ## options 以下是针对 `options` 配置对象的**详细文档说明**: --- ### 📄 `excelToJsonWithImages` 方法配置项 `options` 说明文档 `options` 对象用于配置 `xlsx-to-json-img` 库中 `excelToJsonWithImages(file, options)` 方法的解析规则,主要用于将 Excel 文件中的多个工作表(Sheet)按指定格式转换为 JSON 数据,并支持提取单元格中的图片。 #### 🔧 配置结构概览 ```js const options = { [SheetName]: { columns: [...], headerIndex: Number }, ... }; ``` --- ### ✅ 字段详细说明 | 字段名 | 类型 | 必填 | 说明 | |-------|------|------|-----------------------------------------------------------------------------------| | `SheetName` | `String` | | Excel 文件中工作表(Sheet)的名称,如 `"测试"`、`"Sheet2"`。该名称必须与 Excel 中的实际工作表名称**完全一致**(区分大小写)。 | | `columns` | `Array` | | 定义当前工作表中需要解析的列信息,按顺序对应表头。 | | `headerIndex` | `Number` | | 指定该工作表中**表头所在行的索引**(从 0 开始计数),即第几行是列名所在行。例如:`headerIndex: 1` 表示第 2 行是表头。 | --- ### 📌 `columns` 列配置项说明 `columns` 是一个对象数组,每个对象描述一列的映射规则。 | 字段名 | 类型 | 必填 | 说明 | |-------|------|----|------| | `name` | `String` | | Excel 表格中该列**表头显示的文本**(即列名),用于匹配实际的列。例如:`"联系人"`、`"车牌号"`。匹配时不支持模糊匹配,需完全一致。 | | `field` | `String` | | 转换为 JSON 后,该列数据对应的**字段名(key)**。例如:`"contactPerson"`、`"plateNum"`。可用于后续数据处理。 | | `isImage` | `Boolean` | | 标识该列是否包含**图片数据**。若为 `true`,则库会尝试提取该单元格内的图片(如插入的图片、图像对象等),并以 Base64形式返回。 | > ⚠️ 注意: > - `isImage: true` 的列,其 `name` 必须与 Excel 表头完全匹配。 > - 若同一行多个列设置 `isImage: true`,需确保每列对应单元格中确实有图片,否则可能解析失败或遗漏。 --- ### 📚 示例说明 ```js const options = { 测试: { columns: [ { name: '序号', field: 'index', isImage: false }, { name: '联系人', field: 'contactPerson', isImage: false }, { name: '联系电话', field: 'phone', isImage: false }, { name: '车牌号', field: 'plateNUm', isImage: false }, { name: '车牌颜色', field: 'color', isImage: false }, { name: '图片1', field: 'image1', isImage: true }, { name: '图片2', field: 'image2', isImage: true }, { name: '图片3', field: 'image3', isImage: true } ], headerIndex: 1 }, Sheet2: { columns: [ { name: '序号', field: 'index', isImage: false }, { name: '姓名', field: 'name', isImage: false }, { name: '地址', field: 'address', isImage: false }, { name: '图片', field: 'image', isImage: true }, { name: '照片', field: 'image2', isImage: true } ], headerIndex: 0 } }; ``` #### 解析逻辑说明: - **工作表 "测试"** - 表头位于第 2 行。 - 5 列为普通文本字段,映射为 `index`, `contactPerson`, `phone` 等。 - 3 列为图片列,将尝试提取图片并分别赋值给 `image1`, `image2`, `image3` 字段。 - **工作表 "Sheet2"** - 表头位于第 1 行。 > 💡 建议:如果有多张图片,使用不同的 `field` 名称(如 `photo1`, `photo2`)以避免数据覆盖。 --- ### ⚠️ 使用注意事项 1. **表头匹配严格**:`name` 必须与 Excel 中实际显示的文本完全一致(包括空格、标点)。 2. **headerIndex 0 开始**:`headerIndex: 0` 表示第一行。 3. **字段命名唯一性**:尽量避免多个列使用相同的 `field` 名,防止数据被覆盖。 4. **编码问题**:确保 Excel 文件保存为 `.xlsx` 格式,暂未验证是否支持 `.xls`。 --- --- ### Example ```vue <template> <div class="container"> <input type="text" class="ct-input" :value="filePath" /> <label class="ui-upload">浏览<input ref="file" type="file" style="display: none" @change="handleChange" /></label> </div> </template> <script setup> import { ref } from 'vue'; import { excelToJsonWithImages } from 'xlsx-to-json-img'; const filePath = ref(''); const file = ref(); /** * 上传前处理 */ const handleChange = async (e) => { const file = e.target.files[0]; const options = { 测试: { columns: [ { name: '序号', field: 'index', isImage: false, }, { name: '联系人', field: 'contactPerson', isImage: false, }, { name: '联系电话', field: 'phone', isImage: false, }, { name: '车牌号', field: 'plateNum', isImage: false, }, { name: '车牌颜色', field: 'color', isImage: false, }, { name: '图片1', field: 'image1', isImage: true, }, { name: '图片2', field: 'image2', isImage: true, }, { name: '图片3', field: 'image3', isImage: true, }, ], headerIndex: 1, }, Sheet2: { columns: [ { name: '序号', field: 'index', isImage: false, }, { name: '姓名', field: 'name', isImage: false, }, { name: '地址', field: 'address', isImage: false, }, { name: '图片', field: 'image', isImage: true, }, { name: '照片', field: 'image2', isImage: true, }, ], headerIndex: 0, }, }; const result = await excelToJsonWithImages(file, options); console.log('result', result); // result 输出结果 }; </script> <style scoped></style> ``` ### Result ```js reslut = { images: [ { descr: "ID_1", // 图片的原始名称 form: "A1", // 在表格中的位置, id: "rId1", // 图片的源文件Id imgId: "ID_E3145AF054DF49A69460818F674ECF08", // 图片的Id isFloat: false, // 是否是浮动式,true-是浮动式, false-非浮动式 path: "data:image/image/jpeg;base64,/9j/4AAQSkZJRgABAQEA...",// 图片的basea64 col: 7, // 列号 row: 1, // 行号 sheetName: "测试", // 表格sheet的名称 sheetId: "1", // 表格sheet的Id }, ... ], metadata: { sheetCount: 2, // 表格数量 imageCount: 11, // 图片数量 fileName: "excel测试文档.xlsx", // 文件名称 fileSize: 9266081, // 文件大小 fileLastModified: 1758088337026 // 文件最后修改时间 }, sheets: { Sheets2:[ { address: "测试地址1号", image: "data:image/image/jpeg;base64,/9j/4AAQSkZJRgABAQEA...", image2: "data:image/image/jpeg;base64,/9j/4f2lRXhpZgAASUkq...", index: 1, name: "李四" } ], 测试:[ { color: "蓝色", contactPerson: "张三", image1: "data:image/image/jpeg;base64,/9j/4AAQSkZJRgABAQEA...", image2: "data:image/image/jpeg;base64,/9j/4Q5mRXhpZgAATU0A...", image3: "data:image/image/jpeg;base64,/9j/4AAQSkZJRgABAQEA...", index: 1, phone: 13112345678, plateNum: "测试A12345" }, ... ] } } ```