网站搜索

javascript - 下载后 Excel 的求和函数在以 hh:mm:ss 格式的时间上不工作


下载 xlsx 文件后,我需要在状态栏中求和时间值,并查看平均值、总计、计数等。

我已附上显示当前情况为0的截图。

TS 代码

 public exportAsExcelFile(summary:any[], json: any[], excelFileName: string): void {
    let report = "Global Service Desk SLA";
    let ReportName = [{"Report":`Report Name : ${report}`}];
  
    const worksheet: XLSX.WorkSheet = XLSX.utils.json_to_sheet(ReportName ,{skipHeader:true});
    if(worksheet['A2'] == undefined){
      worksheet['A2'] = {"t":"s","v":`Date Range : ${summary[0].FromDate +" - "+summary[0].ToDate}`};
    }
    if(worksheet['A3'] == undefined){
      worksheet['A3'] = {"t":"s","v":`Bot : ${summary[0].Bot}`}
    }
    if(worksheet['A4'] == undefined){
      worksheet['A4'] = {"t":"s","v":`Timezone : ${summary[0].timeZone}`}
    }
    const workbook: XLSX.WorkBook = { Sheets: { 'data': worksheet }, SheetNames: ['data']};
    XLSX.utils.sheet_add_json(worksheet,json,{origin:"A7"});

    const excelBuffer: any = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
    this.saveAsExcelFile(excelBuffer, excelFileName);
  }

如果我像截图中那样选择队列时间列,平均总数显示为0,我需要在平均值部分显示总值的总和

如果我将 hh:mm:ss 改为 h:mm:ss 会起作用

如果我删除该列单元格中的单个 0,平均总数就会显示,请参见我的截图

我如何通过使用 SheetJS 库的代码来强制执行此类型?或者,有没有其他方法让 Excel 对 hh:mm:ss 格式计算总和?

答案#1

你需要将时间表示为一个数字,即时间的秒数除以 86400。

例如,对于 10:30:00,它是 (10.5 小时 x 60 分钟 x 60 秒)/86400

然后你将需要的单元格的 z 属性设置为 hh:mm:ss。

请参见下面的示例代码,它在美国英语区域设置中有效:

const XLSX = require("xlsx");
const filename = "./Book7.xlsx";

// 3 times: 00:00:00, 00:10:00, 02:30:00
const times = [0, (10 * 60) / 86400, ((2.5 * 60) * 60) / 86400];
const data = [
  ["a", times[0], times[0]],
  ["b", times[1], times[1]],
  ["c", times[2], times[2]],
];

// put array of arrays to sheet
const worksheet = XLSX.utils.aoa_to_sheet(data);

// update 'z' property to time format
for (let i=1; i<=data.length; i++) {
  worksheet[`C${i}`].z = "hh:mm:ss";
}
console.log(worksheet);

// write workbook to disk
const workbook = { Sheets: { 'data': worksheet }, SheetNames: ['data']};
XLSX.writeFile(workbook, filename, {cellNF: true});

请注意,我更新了列 C 的 z 属性,但列 B 保持为简单的数字。总和和平均值显示正常。