getExcelU8ArrFromWorkbook.mjs

import { writeXlsx } from 'hucre/xlsx'
import get from 'lodash-es/get.js'
import isarr from './isarr.mjs'
import iseobj from './iseobj.mjs'


/**
 * 由Excel的Workbook物件轉成為Excel檔案的Uint8Array數據
 *
 * Workbook物件格式為{ sheets: [{ name, rows }] }(見createExcelWorkbook/getExcelWorkbookFromData)
 * 本函數為async function,前後端都可用
 *
 * Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/getExcelU8ArrFromWorkbook.test.mjs Github}
 * @memberOf wsemi
 * @param {Object} wb 輸入Excel的Workbook物件
 * @returns {Promise} 回傳Promise,resolve回傳Excel檔案的Uint8Array數據,wb無效或轉換失敗時resolve回傳{ error }物件
 * @example
 * //need test in nodejs
 *
 * async function test() {
 *
 *     let data = [
 *         ['a', '123', 456],
 *         [null, 'abc123', '', 111.222333],
 *     ]
 *
 *     let wb = getExcelWorkbookFromData(data)
 *     let u8a = await getExcelU8ArrFromWorkbook(wb)
 *     console.log(u8a instanceof Uint8Array, u8a[0], u8a[1])
 *     // => true 80 75 (xlsx為zip容器, 開頭必為'PK')
 *
 * }
 * test()
 *     .catch((err) => {
 *         console.log(err)
 *     })
 *
 */
async function getExcelU8ArrFromWorkbook(wb) {

    //check
    if (!iseobj(wb)) {
        return {
            error: 'wb is not an effective object',
        }
    }
    if (!isarr(get(wb, 'sheets'))) {
        return {
            error: 'wb.sheets is not an array',
        }
    }

    //u8a
    let u8a = null
    try {

        //writeXlsx, wb即為{ sheets }結構可直接傳入, 回傳Uint8Array
        u8a = await writeXlsx(wb)

    }
    catch (err) {
        return {
            error: err
        }
    }

    return u8a
}


export default getExcelU8ArrFromWorkbook