getExcelU8ArrFromData.mjs

import isestr from './isestr.mjs'
import isearr from './isearr.mjs'
import haskey from './haskey.mjs'
import getExcelWorkbookFromData from './getExcelWorkbookFromData.mjs'
import getExcelU8ArrFromWorkbook from './getExcelU8ArrFromWorkbook.mjs'


/**
 * 由數據陣列轉成為Excel檔案的Uint8Array數據
 *
 * 數據陣列可為二維陣列(mat)或物件陣列(ltdt),見getExcelWorksheetFromData
 * 本函數為async function,前後端都可用
 *
 * Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/getExcelU8ArrFromData.test.mjs Github}
 * @memberOf wsemi
 * @param {Array} data 輸入數據陣列,可為二維陣列(mat)或物件陣列(ltdt)
 * @param {String} [sheetName='data'] 輸入輸出為Excel時所在分頁(sheet)名稱字串,預設為'data'
 * @returns {Promise} 回傳Promise,resolve回傳Excel檔案的Uint8Array數據,輸入無效或轉換失敗時resolve回傳{ error }物件
 * @example
 * //need test in nodejs
 *
 * async function test() {
 *
 *     let data = [
 *         ['a', '123', 456],
 *         [null, 'abc123', '', 111.222333],
 *     ]
 *
 *     let u8a = await getExcelU8ArrFromData(data, 'mysheet')
 *     console.log(u8a instanceof Uint8Array, u8a[0], u8a[1])
 *     // => true 80 75 (xlsx為zip容器, 開頭必為'PK')
 *
 *     let r = await getDataFromExcelFileU8Arr(u8a, { fmt: 'array' })
 *     console.log(r[0].sheetname, JSON.stringify(r[0].data))
 *     // => mysheet [["a","123","456",""],["","abc123","","111.222333"]]
 *
 * }
 * test()
 *     .catch((err) => {
 *         console.log(err)
 *     })
 *
 */
async function getExcelU8ArrFromData(data, sheetName = 'data') {

    //check
    if (!isearr(data)) {
        let msg = 'no data'
        return {
            error: msg
        }
    }
    if (!isestr(sheetName)) {
        sheetName = 'data'
    }

    //u8a
    let u8a = null

    //getExcelWorkbookFromData
    let wb = getExcelWorkbookFromData(data, sheetName)

    //check
    if (haskey(wb, 'error')) {
        return wb
    }

    //getExcelU8ArrFromWorkbook
    u8a = await getExcelU8ArrFromWorkbook(wb)

    //check
    if (haskey(u8a, 'error')) {
        return u8a
    }

    return u8a
}


export default getExcelU8ArrFromData