4

我有一个使用SheetJS编写 excel 文件的 Vue 项目。

如何在生成的 Excel 文件中设置列的格式?

我需要将 SalesOrderDate、CustomerRequestedDeliveryDate、ConfirmedDate 和 _ProductionDate 设置为日期格式。

generateExcel() {
    axios.get('generateExcel?format=json', {
        params: {
            division: this.auth.user.current_division,
            area: this.form.area,
            month: this.form.month
        }
    })
    .then(response => {
            let structArray = []
            for (let [index, value] of response.data.entries()) {
                structArray.push({
                    SalesOrderNumber: value.so_id,
                    SalesOrderDate: (value.so_date.trim().length ? moment(value.so_date, 'MMMM, DD YYYY HH:mm:ss', true).format('MM/DD/YYYY'): ''),
                    ShipmentStatus: value.shipment_status,
                    Remarks: value.remarks,
                    ID: value.id,
                    ModelName: value.model_name,
                    ModelNumber: value.model_id,
                    Qty: value.qty,
                    CustomerRequestedDeliveryDate: (value.requested_delivery_date.trim().length ? moment(value.requested_delivery_date, 'MMMM, DD YYYY HH:mm:ss', true).format('MM/DD/YYYY'): ''),
                    ConfirmedDate: (value.confirmed_date.trim().length ? moment(value.confirmed_date, 'MMMM, DD YYYY HH:mm:ss', true).format('MM/DD/YYYY'): ''),
                    'ProductionDateBy': value.production_date_by,
                    '_ProductionDate': (value.production_date.trim().length ? moment(value.production_date, 'MMMM, DD YYYY HH:mm:ss', true).format('MM/DD/YYYY'): ''),
                    '_ProductionRemarks': value.production_remarks,
                })
            }
            this.sheet.jsondata = structArray
            let ws = XLSX.utils.json_to_sheet(this.sheet.jsondata)
            ws['!autofilter'] = { ref: `A1:L${response.data.length+1}` }
            ws.columns = [

            ]
            let wb = XLSX.utils.book_new()
            wb.Props = {
                Title: "Production Schedule Template",
                Author: "Admin"
            }
            XLSX.utils.book_append_sheet(wb, ws, "Schedule")
            let wbout = XLSX.write(wb, {type:"array", bookType:"xlsx"})
            saveAs(
                new Blob([wbout],
                {type:"application/octet-stream"}
            ), "production_schedule.xlsx")
        })
    .catch(error => {
        this.$store.commit('SET_ALERT',{type:'error', message:[error]})
        console.log(error)
    })
},
4

4 回答 4

5

不幸的是,在 SheetJS 中没有轻松格式化列的功能。根据这个问题,这是一种方法:

var colNum = XLSX.utils.decode_col("B"); //decode_col converts Excel col name to an integer for col #
var fmt = '$0.00'; // or '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)' or any Excel number format

/* get worksheet range */
var range = XLSX.utils.decode_range(ws['!ref']);
for(var i = range.s.r + 1; i <= range.e.r; ++i) {
  /* find the data cell (range.s.r + 1 skips the header row of the worksheet) */
  var ref = XLSX.utils.encode_cell({r:i, c:colNum});
  /* if the particular row did not contain data for the column, the cell will not be generated */
  if(!ws[ref]) continue;
  /* `.t == "n"` for number cells */
  if(ws[ref].t != 'n') continue;
  /* assign the `.z` number format */
  ws[ref].z = fmt;
}
于 2019-08-28T23:20:09.497 回答
1

这是 Andrew 的 SheetJS 答案的功能 -

function formatColumn(worksheet, col, fmt) {
  const range = XLSX.utils.decode_range(worksheet['!ref'])
  // note: range.s.r + 1 skips the header row
  for (let row = range.s.r + 1; row <= range.e.r; ++row) {
    const ref = XLSX.utils.encode_cell({ r: row, c: col })
    if (worksheet[ref] && worksheet[ref].t === 'n') {
      worksheet[ref].z = fmt
    }
  }
}

例子:

const rows = [
  ['name', 'cost', 'price'], 
  ['dino', 3.45, 7.95]
]

const workbook = XLSX.utils.book_new()
const worksheet = XLSX.utils.aoa_to_sheet(rows) // array of arrays

const currency = '$0.00'
for (let col of [1, 2]) {
  formatColumn(worksheet, col, currency)
}

XLSX.utils.book_append_sheet(workbook, worksheet, 'Details')
于 2021-04-07T10:15:16.880 回答
0

上面的代码对我不起作用。我认为 sheetJS 改变了他们进行单元格引用的方式。无论如何,对于那些正在处理 sheetJS 将数字转换为文本问题的人。下面的功能可以为您解决这个问题。它的功能与上面布莱恩的回答几乎相同,但它实际上改变了单元格的底层格式(而不是仅仅以某种方式格式化文本)。

参数是

  • 使用 XLSX.utils.aoa_to_sheet(ws_data) 创建的工作表对象
  • 工作表对象上存在的列的字符串名称
  • 您希望此列采用的格式。例如:“n”= 数字。这可以在 npm XLSX 文档中找到。

function formatColumn(ws, col, fmt) {

  var range = XLSX.utils.decode_range(ws['!ref']);
  for(var R = range.s.r; R <= range.e.r; ++R) {
  for(var C = range.s.c; C <= range.e.c; ++C) {
    var cell_address = {c:C, r:R};
    /* if an A1-style address is needed, encode the address */
    var cell_ref = XLSX.utils.encode_cell(cell_address);

    if(!ws[cell_ref]) continue;
  /* `.t == "n"` for number cells */
    ws[cell_ref].t = fmt
  }
}

}

于 2021-12-26T19:48:18.967 回答
-2

如果是iso Date,Excel会自己做,我也使用sheetjs,我导出的 excel 的选择

于 2018-07-26T22:08:03.800 回答