This commit is contained in:
2023-11-20 11:28:49 +08:00
parent 785bb81f18
commit 7d7ee0e05b
50 changed files with 46838 additions and 5781 deletions

View File

@@ -104,7 +104,7 @@ watch(
//关闭回调
const footOnOk = () => {
emits("update:modelValue", Month.value ? Month.value : -1);
emits("update:modelValue", Month.value || Month.value === 0 ? Month.value : -1);
if (datePicker.range) {
//关闭菜单
emits("ok");

View File

@@ -35,6 +35,7 @@ export interface TableRowProps {
expandKeys: Recordable[];
getCheckboxProps: Function;
getRadioProps: Function;
page?: Recordable;
}
const slot = useSlots();
@@ -47,7 +48,10 @@ const emit = defineEmits([
"update:selectedKeys",
"update:selectedKey",
]);
function toThousands(num: number | string) {
function toThousands(num: number | string | undefined) {
if(typeof num == 'undefined'){
return ''
}
if (typeof num == "string") {
num = parseFloat(num || "0");
}
@@ -470,8 +474,12 @@ const radioProps = props.getRadioProps(props.data, props.index);
:type="expandIconType"
@click="handleExpand"
></lay-icon>
{{ index + 1 }}
<template v-if="page">
{{ index + 1 + ((page.current - 1) * page.limit) }}
</template>
<template v-else>
{{ index + 1 }}
</template>
</td>
</template>
</template>

View File

@@ -5,6 +5,8 @@ export default {
</script>
<script setup lang="ts">
import { utils, writeFile } from "xlsx";
import "./index.less";
import {
ref,
@@ -347,9 +349,10 @@ watch(tableDataSource, () => {
emit("update:page", tmp);
// tableDataSource.value = endlist
sxlist.value = {};
// pagecurrent ||
change({
limit: props.page.limit,
current: pagecurrent || props.page.current,
current: props.page.current,
});
}
});
@@ -389,55 +392,112 @@ const print = () => {
document.body.innerHTML = oldContent;
};
/**
* 导出excel
* @param list 导出的信息
* @param header 信息的键名
* @param name 导出文件名称
*/
function exportElcel(list:any,header:any,name:string){
const ws = utils.json_to_sheet(list, {
header,
skipHeader: true
})
console.log(ws)
var tmpWB = {
SheetNames: ['sheet'], //保存的表标题
Sheets: {
sheet: Object.assign(
{},
ws, //内容
{}
)
}
}
writeFile(tmpWB,name + ".xlsx",{
bookType: 'xlsx',
type: 'binary'
})
}
// 报表导出
const exportData = () => {
var tableStr = ``;
let head:any = []
let list:any = []
let title:any = {}
for (let tableHeadColumn of tableHeadColumns.value) {
tableStr += "<tr>";
// tableStr += "<tr>";
for (let column of tableHeadColumn) {
tableStr += `<td colspan=${column.colspan} rowspan=${column.rowspan}>${column.title}</td>`;
// tableStr += `<td colspan=${column.colspan} rowspan=${column.rowspan}>${column.title}</td>`;
title[column.key] = column.title
head.push(column.key)
}
tableStr += "</tr>";
// tableStr += "</tr>";
}
datalist.value.forEach((item, rowIndex) => {
tableStr += "<tr>";
list.push(title)
console.log(tableDataSource.value,tableHeadColumns.value)
tableDataSource.value.forEach((item, rowIndex) => {
let info:any = {}
tableBodyColumns.value.forEach((tableColumn, columnIndex) => {
Object.keys(item).forEach((name) => {
if (tableColumn.key === name) {
const rowColSpan = props.spanMethod(
item,
tableColumn,
rowIndex,
columnIndex
);
const rowspan = rowColSpan ? rowColSpan[0] : 1;
const colspan = rowColSpan ? rowColSpan[1] : 1;
if (rowspan != 0 && colspan != 0) {
tableStr += `<td colspan=${colspan} rowspan=${rowspan}>${item[name]}</td>`;
// const rowColSpan = props.spanMethod(
// item,
// tableColumn,
// rowIndex,
// columnIndex
// );
// const rowspan = rowColSpan ? rowColSpan[0] : 1;
// const colspan = rowColSpan ? rowColSpan[1] : 1;
// if (rowspan != 0 && colspan != 0) {
// tableStr += `<td colspan=${colspan} rowspan=${rowspan}${tableColumn.valueType == 'str' ? ' x:str' : ''}>${item[name] || ''}</td>`;
// }
if(tableColumn.valueType == "str"){
info[name] = item[name]
}else{
info[name] = isNaN(Number(item[name])) || (!item[name] && item[name] !== 0) ? item[name] : Number(item[name])
}
}
});
if(tableColumn.type == "number"){
// const rowColSpan = props.spanMethod(
// item,
// tableColumn,
// rowIndex,
// columnIndex
// );
// const rowspan = rowColSpan ? rowColSpan[0] : 1;
// const colspan = rowColSpan ? rowColSpan[1] : 1;
// if (rowspan != 0 && colspan != 0) {
// tableStr += `<td colspan=${colspan} rowspan=${rowspan}>${rowIndex + 1}</td>`;
// }
info[tableColumn.key] = rowIndex + 1
}
});
tableStr += "</tr>";
// tableStr += "</tr>";
list.push(info)
});
var worksheet = "Sheet1";
var uri = "data:application/vnd.ms-excel;base64,";
var exportTemplate = `<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns="http://www.w3.org/TR/REC-html40">
<head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>
<x:Name>${worksheet}</x:Name>
<x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet>
</x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->
</head>
<body>
<table syle="table-layout: fixed;word-wrap: break-word; word-break: break-all;">${tableStr}</table>
</body>
</html>`;
let a = document.createElement("a");
a.href = uri + base64(exportTemplate);
a.download = (props.download || "下载文件") + ".xls";
a.click();
// var worksheet = "Sheet1";
// var uri = "data:application/vnd.ms-excel;base64,";
// var exportTemplate = `<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel"
// xmlns="http://www.w3.org/TR/REC-html40">
// <head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>
// <x:Name>${worksheet}</x:Name>
// <x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet>
// </x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->
// </head>
// <body>
// <table syle="table-layout: fixed;word-wrap: break-word; word-break: break-all;">${tableStr}</table>
// </body>
// </html>`;
// let a = document.createElement("a");
// a.href = uri + base64(exportTemplate);
// a.download = (props.download || "下载文件") + ".xls";
// a.click();
// window.location.href =
exportElcel(list,head,(props.download || "下载文件"))
return;
};
@@ -817,9 +877,10 @@ watch(
});
} else {
tableDataSource.value = endlist;
// pagecurrent ||
change({
limit: props.page.limit,
current: pagecurrent || props.page.current,
current: props.page.current,
isReload: true,
});
}
@@ -1078,6 +1139,7 @@ window.addEventListener("click", heddin);
@row="rowClick"
@row-double="rowDoubleClick"
@row-contextmenu="rowContextmenu"
:page="page"
>
<template v-for="name in slotsData" #[name]="{ data }">
<slot :name="name" :data="data"></slot>