feat: 新增导出整车列表
parent
d364741783
commit
445ae91686
@ -0,0 +1,140 @@
|
||||
<template>
|
||||
<span>
|
||||
报表下载
|
||||
</span>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, onMounted } from 'vue';
|
||||
import ExcelJS from 'exceljs';
|
||||
import { saveAs } from 'file-saver-es';
|
||||
|
||||
// 模拟列表数据 (替换成你的真实数据)
|
||||
const listData = [
|
||||
{
|
||||
trainCode: 'T-20250508',
|
||||
trainType: 'C54K',
|
||||
occurrenceTime: 5785.67354,
|
||||
alarmType: '车辆损坏',
|
||||
faultType: '搭扣未扣',
|
||||
},
|
||||
];
|
||||
|
||||
// 模拟图片 URL (替换成你的真实图片URL)
|
||||
const imageUrl = ref(''); // Replace with the actual image URL
|
||||
const placeholderImageUrl = 'https://via.placeholder.com/150'; // Fallback
|
||||
|
||||
const convertImageToBase64 = async (url: string) => {
|
||||
try {
|
||||
const response = await fetch(url);
|
||||
const blob = await response.blob();
|
||||
return new Promise<string>((resolve, reject) => {
|
||||
const reader = new FileReader();
|
||||
reader.onloadend = () => resolve(reader.result as string);
|
||||
reader.onerror = reject;
|
||||
reader.readAsDataURL(blob);
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Error loading image:', error);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
const saveToExcel = async () => {
|
||||
const workbook = new ExcelJS.Workbook();
|
||||
const worksheet = workbook.addWorksheet('Sheet1');
|
||||
|
||||
// 1. 设置列宽 (根据你的内容调整)
|
||||
worksheet.getColumn('A').width = 15;
|
||||
worksheet.getColumn('B').width = 15;
|
||||
worksheet.getColumn('C').width = 15;
|
||||
worksheet.getColumn('D').width = 10; // Smaller width for '车型'
|
||||
worksheet.getColumn('E').width = 15;
|
||||
worksheet.getColumn('F').width = 15;
|
||||
worksheet.getColumn('G').width = 15;
|
||||
worksheet.getColumn('H').width = 10;
|
||||
worksheet.getColumn('I').width = 10;
|
||||
|
||||
|
||||
// 2. 添加头部数据
|
||||
worksheet.getCell('A1').value = '进场时间';
|
||||
worksheet.getCell('B1').value = '出场时间';
|
||||
worksheet.getCell('A3').value = '车厢编号';
|
||||
worksheet.getCell('C3').value = '1234567890'; // Example Value
|
||||
|
||||
// 3. 添加表格头部
|
||||
worksheet.getCell('C5').value = '列车编号';
|
||||
worksheet.getCell('D5').value = '车型';
|
||||
worksheet.getCell('E5').value = '发生时间';
|
||||
worksheet.getCell('F5').value = '告警类型';
|
||||
worksheet.getCell('G5').value = '故障类型';
|
||||
|
||||
// 4. 填充表格数据
|
||||
listData.forEach((item, index) => {
|
||||
const row = index + 6; // 从第6行开始
|
||||
worksheet.getCell(`C${row}`).value = item.trainCode;
|
||||
worksheet.getCell(`D${row}`).value = item.trainType;
|
||||
worksheet.getCell(`E${row}`).value = item.occurrenceTime;
|
||||
worksheet.getCell(`F${row}`).value = item.alarmType;
|
||||
worksheet.getCell(`G${row}`).value = item.faultType;
|
||||
});
|
||||
|
||||
// 5. 添加图片
|
||||
|
||||
// Load the image (using a data URL or URL)
|
||||
try {
|
||||
if (imageUrl.value) {
|
||||
const base64Image = await convertImageToBase64(imageUrl.value);
|
||||
|
||||
if (base64Image) {
|
||||
const imageId = workbook.addImage({
|
||||
base64: base64Image,
|
||||
extension: 'png', // Adjust extension if needed (jpeg, etc.)
|
||||
});
|
||||
|
||||
// Add the image to the worksheet
|
||||
worksheet.addImage(imageId, {
|
||||
tl: { col: 2, row: 8 }, // Top left corner of the image (C9 in Excel)
|
||||
br: { col: 7, row: 25 }, // Bottom right corner of the image (H26 in Excel)
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.error('Error adding image:', error);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 6. 添加 "车身缺陷" 文本
|
||||
worksheet.getCell('A17').value = '车身缺陷';
|
||||
|
||||
// 7. 设置 H 列的背景色
|
||||
for (let i = 8; i <= 28; i++) {
|
||||
const cell = worksheet.getCell(`H${i}`);
|
||||
cell.fill = {
|
||||
type: 'pattern',
|
||||
pattern: 'solid',
|
||||
fgColor: { argb: 'ADD8E6' }, // Light blue color
|
||||
};
|
||||
}
|
||||
|
||||
// 8. (Optional) Style the header rows
|
||||
const headerRange = 'A1:G5'; // Adjust as needed
|
||||
worksheet.getCell(headerRange).font = { bold: true };
|
||||
worksheet.getCell(headerRange).alignment = { vertical: 'middle', horizontal: 'center' }; // Center align headers
|
||||
|
||||
// 9. 下载 Excel 文件
|
||||
const buffer = await workbook.xlsx.writeBuffer();
|
||||
saveAs(new Blob([buffer], { type: 'application/octet-stream' }), '车辆信息.xlsx');
|
||||
};
|
||||
|
||||
|
||||
onMounted(async () => {
|
||||
// Pre-load the image (or use a placeholder if loading fails)
|
||||
imageUrl.value = 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/65/No-Image-Placeholder.svg/1665px-No-Image-Placeholder.svg.png'
|
||||
});
|
||||
|
||||
|
||||
</script>
|
@ -0,0 +1,166 @@
|
||||
import ExcelJS from "exceljs";
|
||||
// import { saveAs } from 'file-saver-es';
|
||||
|
||||
// 模拟列表数据 (替换成你的真实数据)
|
||||
|
||||
export const useTrainSaveToExcel = (props) => {
|
||||
const { arrive_at, data, leave_at } = props;
|
||||
console.log("useTrainSaveToExcel_data", data);
|
||||
const listData = [
|
||||
{
|
||||
trainCode: "T-20250508",
|
||||
trainType: "C54K",
|
||||
occurrenceTime: 5785.67354,
|
||||
alarmType: "车辆损坏",
|
||||
faultType: "搭扣未扣",
|
||||
},
|
||||
{
|
||||
trainCode: "T-20250508",
|
||||
trainType: "C54K",
|
||||
occurrenceTime: 5785.67354,
|
||||
alarmType: "车辆损坏",
|
||||
faultType: "搭扣未扣",
|
||||
},
|
||||
{
|
||||
trainCode: "T-20250508",
|
||||
trainType: "C54K",
|
||||
occurrenceTime: 5785.67354,
|
||||
alarmType: "车辆损坏",
|
||||
faultType: "搭扣未扣",
|
||||
},
|
||||
];
|
||||
// 模拟图片 URL (替换成你的真实图片URL)
|
||||
const imageUrl =
|
||||
"http://192.168.10.14:8123/sftp/2025-07-01/20250701_131010.jpg"; // Fallback
|
||||
|
||||
const convertImageToBase64 = async (url: string) => {
|
||||
try {
|
||||
const response = await fetch(url);
|
||||
const blob = await response.blob();
|
||||
return new Promise<string>((resolve, reject) => {
|
||||
const reader = new FileReader();
|
||||
reader.onloadend = () => resolve(reader.result as string);
|
||||
reader.onerror = reject;
|
||||
reader.readAsDataURL(blob);
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("Error loading image:", error);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
const saveToExcel = async () => {
|
||||
const workbook = new ExcelJS.Workbook();
|
||||
const worksheet = workbook.addWorksheet("Sheet1");
|
||||
|
||||
// 1. 设置列宽 (根据你的内容调整)
|
||||
worksheet.getColumn("A").width = 15;
|
||||
worksheet.getColumn("B").width = 15;
|
||||
worksheet.getColumn("C").width = 15;
|
||||
worksheet.getColumn("D").width = 10; // Smaller width for '车型'
|
||||
worksheet.getColumn("E").width = 15;
|
||||
worksheet.getColumn("F").width = 15;
|
||||
worksheet.getColumn("G").width = 15;
|
||||
worksheet.getColumn("H").width = 10;
|
||||
worksheet.getColumn("I").width = 10;
|
||||
|
||||
// 2. 添加头部数据
|
||||
worksheet.getCell("A1").value = "进场时间";
|
||||
worksheet.getCell("B1").value = "出场时间";
|
||||
worksheet.getCell("A3").value = "车厢编号";
|
||||
worksheet.getCell("C3").value = "1234567890"; // Example Value
|
||||
|
||||
// 3. 添加表格头部
|
||||
worksheet.getCell("C5").value = "列车编号";
|
||||
worksheet.getCell("D5").value = "车型";
|
||||
worksheet.getCell("E5").value = "发生时间";
|
||||
worksheet.getCell("F5").value = "告警类型";
|
||||
worksheet.getCell("G5").value = "故障类型";
|
||||
|
||||
const loadRemark = async (record) => {
|
||||
try {
|
||||
if (imageUrl) {
|
||||
const base64Image = await convertImageToBase64(imageUrl);
|
||||
|
||||
if (base64Image) {
|
||||
const imageId = workbook.addImage({
|
||||
base64: base64Image,
|
||||
extension: "png", // Adjust extension if needed (jpeg, etc.)
|
||||
});
|
||||
|
||||
// Add the image to the worksheet
|
||||
worksheet.addImage(imageId, {
|
||||
tl: { col: 2, row: 8 }, // Top left corner of the image (C9 in Excel)
|
||||
br: { col: 7, row: 25 }, // Bottom right corner of the image (H26 in Excel)
|
||||
});
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Error adding image:", error);
|
||||
}
|
||||
}
|
||||
|
||||
// 4. 填充表格数据
|
||||
listData.forEach((item, index) => {
|
||||
const row = index + 6; // 从第6行开始
|
||||
worksheet.getCell(`C${row}`).value = item.trainCode;
|
||||
worksheet.getCell(`D${row}`).value = item.trainType;
|
||||
worksheet.getCell(`E${row}`).value = item.occurrenceTime;
|
||||
worksheet.getCell(`F${row}`).value = item.alarmType;
|
||||
worksheet.getCell(`G${row}`).value = item.faultType;
|
||||
loadRemark(item);
|
||||
});
|
||||
|
||||
// 5. 添加图片
|
||||
|
||||
// Load the image (using a data URL or URL)
|
||||
|
||||
// 6. 添加 "车身缺陷" 文本
|
||||
worksheet.getCell("A17").value = "车身缺陷";
|
||||
|
||||
// 7. 设置 H 列的背景色
|
||||
for (let i = 8; i <= 28; i++) {
|
||||
const cell = worksheet.getCell(`H${i}`);
|
||||
cell.fill = {
|
||||
type: "pattern",
|
||||
pattern: "solid",
|
||||
fgColor: { argb: "ADD8E6" }, // Light blue color
|
||||
};
|
||||
}
|
||||
|
||||
// 8. (Optional) Style the header rows
|
||||
const headerRanges = ["A1:G5", "B1:G5"]; // Adjust as needed
|
||||
// const headerRange = "A1:G5, B8:G5"; // Adjust as needed
|
||||
for (const headerRange of headerRanges) {
|
||||
worksheet.getCell(headerRange).font = { bold: true };
|
||||
worksheet.getCell(headerRange).alignment = {
|
||||
vertical: "middle",
|
||||
horizontal: "center",
|
||||
}; // Center align headers
|
||||
}
|
||||
|
||||
// 9. 下载 Excel 文件
|
||||
const buffer = await workbook.xlsx.writeBuffer();
|
||||
try {
|
||||
const blob = new Blob([buffer], {
|
||||
type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||||
});
|
||||
const url = URL.createObjectURL(blob);
|
||||
const link = document.createElement("a");
|
||||
link.href = url;
|
||||
link.download = "车辆信息.xlsx";
|
||||
link.click();
|
||||
URL.revokeObjectURL(url);
|
||||
} catch (error) {
|
||||
console.error("导出 Excel 文件时出错:", error);
|
||||
}
|
||||
// saveAs(
|
||||
// new Blob([buffer], { type: "application/octet-stream" }),
|
||||
// "车辆信息.xlsx"
|
||||
// );
|
||||
};
|
||||
|
||||
return {
|
||||
saveToExcel,
|
||||
};
|
||||
};
|
Loading…
Reference in New Issue