2 Commits
95c4fc208f
...
6130e1e899
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
6130e1e899 |
Merge branch 'master' of http://140.143.162.39:3000/shentun/peisweb
|
4 months ago |
|
|
cad7af85f1 |
报表
|
4 months ago |
17 changed files with 395 additions and 84 deletions
-
178src/utlis/Export3Excel.js
-
13src/views/basic-dictionary/ApplicableGender.vue
-
23src/views/basic-dictionary/CharacterCategories.vue
-
23src/views/basic-dictionary/CommonCharacters.vue
-
21src/views/basic-dictionary/CustomerOrgType.vue
-
23src/views/basic-dictionary/DiagnosisLevel.vue
-
23src/views/basic-dictionary/DiagnosisPostfix.vue
-
23src/views/basic-dictionary/DiseaseScreening.vue
-
17src/views/basic-dictionary/GuideType.vue
-
22src/views/basic-dictionary/ItemDefaultResult.vue
-
19src/views/basic-dictionary/MaritalStatus.vue
-
20src/views/basic-dictionary/MedicalConclusion.vue
-
20src/views/basic-dictionary/MedicalConclusionType.vue
-
22src/views/basic-dictionary/MedicalReportType.vue
-
15src/views/basic-dictionary/ResultStatus.vue
-
13src/views/basic-dictionary/Sex.vue
-
4src/views/customerReport/personnelPositive.vue
@ -0,0 +1,178 @@ |
|||
import * as XLSX from 'xlsx'; |
|||
import XLSXStyle from 'xlsx-style'; |
|||
import { saveAs } from 'file-saver'; |
|||
|
|||
function s2ab(s) { |
|||
var buf = new ArrayBuffer(s.length); |
|||
var view = new Uint8Array(buf); |
|||
for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF; |
|||
return buf; |
|||
} |
|||
|
|||
// 根据dom导出表格
|
|||
export function exportToExcel(idSelector, fileName, isNew, list, titleNum = 1) { |
|||
let table = document.querySelector(idSelector).cloneNode(true); |
|||
// 因为element-ui的表格的fixed属性导致多出一个table,会下载重复内容,这里删除掉
|
|||
if (table.querySelector('.el-table__fixed-right')) { |
|||
table.removeChild(table.querySelector('.el-table__fixed-right')); |
|||
} |
|||
if (table.querySelector('.el-table__fixed')) { |
|||
table.removeChild(table.querySelector('.el-table__fixed')); |
|||
} |
|||
|
|||
// 直接从DOM中提取表格数据,而不是转换整个表格
|
|||
const rows = []; |
|||
const tableRows = table.querySelectorAll('tr'); |
|||
|
|||
tableRows.forEach((tr, rowIndex) => { |
|||
const row = []; |
|||
const cells = tr.querySelectorAll('th, td'); |
|||
|
|||
cells.forEach((cell, cellIndex) => { |
|||
let cellValue = ''; |
|||
// 检测包含多个div的单元格(这通常表示有多行内容)
|
|||
const divs = cell.querySelectorAll('div'); |
|||
|
|||
if (divs.length > 0) { |
|||
// 将多个div的内容用\r\n连接(这是Excel兼容的换行符)
|
|||
const divContents = Array.from(divs).map(div => div.textContent.trim()); |
|||
cellValue = divContents.join('\r\n').replace(/^.*\r\n/, "").replace(/\r\n?$/, ''); |
|||
} else { |
|||
// 否则直接获取文本内容
|
|||
cellValue = cell.innerText || cell.textContent; |
|||
// 清理多余的空白字符,但保留换行符
|
|||
cellValue = cellValue |
|||
.replace(/\s+/g, (match) => match.includes('\n') ? '\n' : ' ') |
|||
.trim(); |
|||
// 确保换行符是Excel兼容的格式
|
|||
cellValue = cellValue.replace(/\r\n/g, '\n').replace(/\n/g, '\r\n'); |
|||
} |
|||
|
|||
row.push(cellValue); |
|||
}); |
|||
|
|||
rows.push(row); |
|||
}); |
|||
|
|||
// 使用XLSX.utils.aoa_to_sheet(数组到工作表)而不是从DOM转换
|
|||
const ws = XLSX.utils.aoa_to_sheet(rows); |
|||
|
|||
|
|||
// 为包含换行符的单元格设置wrapText: true样式
|
|||
const range = XLSX.utils.decode_range(ws['!ref']); |
|||
for (let R = range.s.r; R <= range.e.r; ++R) { |
|||
for (let C = range.s.c; C <= range.e.c; ++C) { |
|||
const cell_address = XLSX.utils.encode_cell({ c: C, r: R }); |
|||
const cell = ws[cell_address]; |
|||
|
|||
if (cell && typeof cell.v === 'string' && cell.v.includes('\r\n')) { |
|||
// 设置单元格样式以支持文本换行
|
|||
if (!cell.s) cell.s = {}; |
|||
cell.s = { |
|||
alignment: { |
|||
wrapText: true, // 启用自动换行
|
|||
vertical: 'center', // 垂直居中对齐
|
|||
horizontal: 'left' // 水平左对齐
|
|||
} |
|||
}; |
|||
|
|||
// 确保单元格类型为字符串类型,以支持换行
|
|||
cell.t = 's'; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// 创建工作簿并添加工作表
|
|||
const wb = XLSX.utils.book_new(); |
|||
XLSX.utils.book_append_sheet(wb, ws, 'Sheet1'); |
|||
|
|||
// 计算列宽
|
|||
let cWidth = []; |
|||
for (let C = range.s.c; C <= range.e.c; ++C) { |
|||
let len = 100; //默认列宽
|
|||
let len_max = 400; //最大列宽
|
|||
for (let R = range.s.r; R <= range.e.r; ++R) { |
|||
const cell_address = XLSX.utils.encode_cell({ c: C, r: R }); |
|||
const cell = ws[cell_address]; |
|||
if (cell) { |
|||
// 动态自适应:计算列宽
|
|||
let va = cell.v; |
|||
// 确保va是字符串类型再进行处理
|
|||
if (typeof va === 'string') { |
|||
// 替换回车符为换行符进行计算 - 统一使用 \n 计算宽度
|
|||
va = va.replace(/\r\n/g, '\n'); |
|||
var card1 = va.match(/[\u4e00-\u9fa5]/g); //匹配中文
|
|||
var card11 = ""; |
|||
if (card1) { |
|||
card11 = card1.join(""); |
|||
} |
|||
var card2 = va.replace(/([^\u0000-\u00FF])/g, ""); //剔除中文
|
|||
let st = 0; |
|||
if (card11) { |
|||
// st += card11.length * 16 //中文字节码长度
|
|||
st += card11.length * 20 //中文字节码长度
|
|||
} |
|||
if (card2) { |
|||
// st += card2.length * 8 //非中文字节码长度
|
|||
st += card2.length * 10 //非中文字节码长度
|
|||
} |
|||
if (st > len) { |
|||
len = st; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
if (len > len_max) { //最大宽度
|
|||
len = len_max; |
|||
} |
|||
|
|||
cWidth.push({ 'wpx': len }); //列宽
|
|||
} |
|||
ws['!cols'] = cWidth; |
|||
|
|||
// 根据内容行数调整行高,以适应多行文本
|
|||
const rowHeights = []; |
|||
for (let R = range.s.r; R <= range.e.r; ++R) { |
|||
let maxLineCount = 1; // 默认一行
|
|||
for (let C = range.s.c; C <= range.e.c; ++C) { |
|||
const cell_address = XLSX.utils.encode_cell({ c: C, r: R }); |
|||
const cell = ws[cell_address]; |
|||
if (cell && typeof cell.v === 'string') { |
|||
// 统一使用 \n 计算行数,因为原始内容使用 \n 作为换行符
|
|||
const lineCount = (cell.v.replace(/\r\n/g, '\n').match(/\n/g) || []).length + 1; |
|||
if (lineCount > maxLineCount) { |
|||
maxLineCount = lineCount; |
|||
} |
|||
} |
|||
} |
|||
// 如果有多行内容,设置更大的行高
|
|||
if (maxLineCount > 1) { |
|||
rowHeights[R] = { hpt: maxLineCount * 18 }; // 每行18磅高度,给换行留出更多空间
|
|||
} |
|||
} |
|||
ws['!rows'] = rowHeights; |
|||
|
|||
// 检查是否可以使用xlsx-style,否则使用标准xlsx
|
|||
let wbout; |
|||
try { |
|||
// 尝试使用xlsx-style(如果已安装)
|
|||
if (typeof XLSXStyle !== 'undefined' && XLSXStyle && XLSXStyle.write) { |
|||
wbout = XLSXStyle.write(wb, { bookType: 'xlsx', bookSST: false, type: 'binary', cellStyles: true }); |
|||
} else { |
|||
// 如果xlsx-style不可用,使用标准xlsx并设置参数以支持样式
|
|||
wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: false, type: 'binary', cellStyles: true }); |
|||
} |
|||
} catch (e) { |
|||
// 如果xlsx-style失败,回退到标准xlsx
|
|||
wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: false, type: 'binary', cellStyles: true }); |
|||
} |
|||
|
|||
try { |
|||
saveAs(new Blob([s2ab(wbout)], { type: '' }), `${fileName}.xlsx`) |
|||
} catch (e) { |
|||
if (typeof console !== 'undefined') { |
|||
console.log(e, wbout) |
|||
} |
|||
} |
|||
return wbout |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue