mirror of
https://github.com/earthjasonlin/zzz-signal-search-export.git
synced 2025-04-20 23:50:17 +08:00
172 lines
4.9 KiB
JavaScript
172 lines
4.9 KiB
JavaScript
const ExcelJS = require('./module/exceljs.min.js')
|
|
const getData = require('./getData').getData
|
|
const { app, ipcMain, dialog } = require('electron')
|
|
const fs = require('fs-extra')
|
|
const path = require('path')
|
|
const i18n = require('./i18n')
|
|
|
|
function pad(num) {
|
|
return `${num}`.padStart(2, "0");
|
|
}
|
|
|
|
function getTimeString() {
|
|
const d = new Date();
|
|
const YYYY = d.getFullYear();
|
|
const MM = pad(d.getMonth() + 1);
|
|
const DD = pad(d.getDate());
|
|
const HH = pad(d.getHours());
|
|
const mm = pad(d.getMinutes());
|
|
const ss = pad(d.getSeconds());
|
|
return `${YYYY}${MM}${DD}_${HH}${mm}${ss}`;
|
|
}
|
|
|
|
const addRawSheet = (workbook, data) => {
|
|
const sheet = workbook.addWorksheet('rawData', {views: [{state: 'frozen', ySplit: 1}]})
|
|
const excelKeys = ['gacha_id', 'gacha_type', 'id', 'item_id', 'item_type', 'lang', 'name', 'rank_type', 'time', 'uid']
|
|
sheet.columns = excelKeys.map((key, index) => {
|
|
return {
|
|
header: key,
|
|
key,
|
|
}
|
|
})
|
|
const temp = []
|
|
for (let [key, value] of data.result) {
|
|
for (let log of value){
|
|
const arr = []
|
|
arr.push(log.gacha_id)
|
|
arr.push(log.gacha_type)
|
|
arr.push(log.id)
|
|
arr.push(log.item_id)
|
|
arr.push(log.item_type)
|
|
arr.push(data.lang)
|
|
arr.push(log.name)
|
|
arr.push(log.rank_type)
|
|
arr.push(log.time)
|
|
arr.push(data.uid)
|
|
temp.push(arr)
|
|
}
|
|
}
|
|
sheet.addRows(temp)
|
|
}
|
|
|
|
const start = async () => {
|
|
const { header, customFont, filePrefix, fileType, wish2 } = i18n.excel
|
|
const { dataMap, current } = await getData()
|
|
const data = dataMap.get(current)
|
|
// https://github.com/sunfkny/genshin-gacha-export-js/blob/main/index.js
|
|
const workbook = new ExcelJS.Workbook()
|
|
for (let [key, value] of data.result) {
|
|
const name = data.typeMap.get(key)
|
|
const sheet = workbook.addWorksheet(name.replace(/[*?:\/\\]/g, ' '), {views: [{state: 'frozen', ySplit: 1}]})
|
|
let width = [24, 14, 8, 8, 8, 8, 8]
|
|
if (!data.lang.includes('zh-')) {
|
|
width = [24, 32, 16, 12, 12, 12, 8]
|
|
}
|
|
const excelKeys = ['time', 'name', 'type', 'rank', 'total', 'pity', 'remark']
|
|
sheet.columns = excelKeys.map((key, index) => {
|
|
return {
|
|
header: header[key],
|
|
key,
|
|
width: width[index]
|
|
}
|
|
})
|
|
// get gacha logs
|
|
const logs = value
|
|
let total = 0
|
|
let pity = 0
|
|
const temp = []
|
|
for (let log of logs) {
|
|
const arr = []
|
|
total += 1
|
|
pity += 1
|
|
arr.push(log.time)
|
|
arr.push(log.name)
|
|
arr.push(log.item_type)
|
|
if(log.rank_type === '2') {
|
|
arr.push(i18n.ui.data.star2)
|
|
} else if(log.rank_type === '3') {
|
|
arr.push(i18n.ui.data.star3)
|
|
} else {
|
|
arr.push(i18n.ui.data.star4)
|
|
}
|
|
arr.push(total)
|
|
arr.push(pity)
|
|
temp.push(arr)
|
|
if (log.rank_type === '4') {
|
|
pity = 0
|
|
}
|
|
// if (key === '301') {
|
|
// if (log.gacha_type === '400') {
|
|
// log.push(wish2)
|
|
// }
|
|
// }
|
|
}
|
|
|
|
sheet.addRows(temp)
|
|
// set xlsx hearer style
|
|
;(["A", "B", "C", "D","E","F", "G"]).forEach((v) => {
|
|
sheet.getCell(`${v}1`).border = {
|
|
top: {style:'thin', color: {argb:'ffc4c2bf'}},
|
|
left: {style:'thin', color: {argb:'ffc4c2bf'}},
|
|
bottom: {style:'thin', color: {argb:'ffc4c2bf'}},
|
|
right: {style:'thin', color: {argb:'ffc4c2bf'}}
|
|
}
|
|
sheet.getCell(`${v}1`).fill = {
|
|
type: 'pattern',
|
|
pattern:'solid',
|
|
fgColor:{argb:'ffdbd7d3'},
|
|
}
|
|
sheet.getCell(`${v}1`).font ={
|
|
name: customFont,
|
|
color: { argb: "ff757575" },
|
|
bold : true
|
|
}
|
|
|
|
})
|
|
// set xlsx cell style
|
|
logs.forEach((v, i) => {
|
|
;(["A", "B", "C", "D","E","F", "G"]).forEach((c) => {
|
|
sheet.getCell(`${c}${i + 2}`).border = {
|
|
top: {style:'thin', color: {argb:'ffc4c2bf'}},
|
|
left: {style:'thin', color: {argb:'ffc4c2bf'}},
|
|
bottom: {style:'thin', color: {argb:'ffc4c2bf'}},
|
|
right: {style:'thin', color: {argb:'ffc4c2bf'}}
|
|
}
|
|
sheet.getCell(`${c}${i + 2}`).fill = {
|
|
type: 'pattern',
|
|
pattern:'solid',
|
|
fgColor:{argb:'ffebebeb'},
|
|
}
|
|
// rare rank background color
|
|
const rankColor = {
|
|
2: "ff8e8e8e",
|
|
3: "ffa256e1",
|
|
4: "ffbd6932",
|
|
}
|
|
sheet.getCell(`${c}${i + 2}`).font = {
|
|
name: customFont,
|
|
color: { argb: rankColor[v.rank_type] },
|
|
bold : v.rank_type != "2"
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
addRawSheet(workbook, data)
|
|
|
|
const buffer = await workbook.xlsx.writeBuffer()
|
|
const filePath = dialog.showSaveDialogSync({
|
|
defaultPath: path.join(app.getPath('downloads'), `${filePrefix}_${getTimeString()}`),
|
|
filters: [
|
|
{ name: fileType, extensions: ['xlsx'] }
|
|
]
|
|
})
|
|
if (filePath) {
|
|
await fs.ensureFile(filePath)
|
|
await fs.writeFile(filePath, buffer)
|
|
}
|
|
}
|
|
|
|
ipcMain.handle('SAVE_EXCEL', async () => {
|
|
await start()
|
|
}) |