Re-organise and improve exports
This commit is contained in:
parent
52fd13ece9
commit
246b43c8e4
@ -8,7 +8,7 @@ Small lib to parse/understand .ods and .xsls files in the browser and node.js
|
|||||||
### Install
|
### Install
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
npm i github:DavidBruant/ods-xlsx#v0.4.0
|
npm i github:DavidBruant/ods-xlsx#v0.5.0
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -3,11 +3,12 @@
|
|||||||
let _DOMParser
|
let _DOMParser
|
||||||
|
|
||||||
if(typeof DOMParser !== 'undefined' && Object(DOMParser) === DOMParser && DOMParser.prototype && typeof DOMParser.prototype.parseFromString === 'function'){
|
if(typeof DOMParser !== 'undefined' && Object(DOMParser) === DOMParser && DOMParser.prototype && typeof DOMParser.prototype.parseFromString === 'function'){
|
||||||
console.info('[ods-xlsx] Already existing DOMParser. Certainly in the browser')
|
//console.info('[ods-xlsx] Already existing DOMParser. Certainly in the browser')
|
||||||
|
|
||||||
_DOMParser = DOMParser
|
_DOMParser = DOMParser
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
console.info('[ods-xlsx] No native DOMParser. Certainly in Node.js')
|
//console.info('[ods-xlsx] No native DOMParser. Certainly in Node.js')
|
||||||
|
|
||||||
const xmldom = await import('@xmldom/xmldom')
|
const xmldom = await import('@xmldom/xmldom')
|
||||||
_DOMParser = xmldom.DOMParser
|
_DOMParser = xmldom.DOMParser
|
||||||
@ -40,11 +41,22 @@ export function getXLSXTableRawContent(xlsxArrBuff){
|
|||||||
|
|
||||||
|
|
||||||
export {
|
export {
|
||||||
isRowNotEmpty,
|
|
||||||
// table-level exports
|
// table-level exports
|
||||||
tableWithoutEmptyRows,
|
tableWithoutEmptyRows,
|
||||||
tableRawContentToValues,
|
tableRawContentToValues,
|
||||||
tableRawContentToStrings,
|
tableRawContentToStrings,
|
||||||
tableRawContentToObjects,
|
tableRawContentToObjects,
|
||||||
|
|
||||||
|
// sheet-level exports
|
||||||
|
sheetRawContentToObjects,
|
||||||
|
sheetRawContentToStrings,
|
||||||
|
|
||||||
|
// row-level exports
|
||||||
|
rowRawContentToStrings,
|
||||||
|
isRowNotEmpty,
|
||||||
|
|
||||||
|
// cell-level exports
|
||||||
|
cellRawContentToStrings,
|
||||||
|
convertCellValue
|
||||||
} from './shared.js'
|
} from './shared.js'
|
||||||
|
|
||||||
|
|||||||
@ -111,13 +111,12 @@ export async function _getXLSXTableRawContent(arrayBuffer, parseXML) {
|
|||||||
return new Map(await Promise.all(sheetDataPs));
|
return new Map(await Promise.all(sheetDataPs));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts a cell value to the appropriate JavaScript type based on its cell type.
|
* Converts a cell value to the appropriate JavaScript type based on its cell type.
|
||||||
* @param {SheetCellRawContent} _
|
* @param {SheetCellRawContent} _
|
||||||
* @returns {number | boolean | string | Date} The converted value.
|
* @returns {number | boolean | string | Date} The converted value.
|
||||||
*/
|
*/
|
||||||
function convertCellValue({value, type}) {
|
export function convertCellValue({value, type}) {
|
||||||
if(value === ''){
|
if(value === ''){
|
||||||
return ''
|
return ''
|
||||||
}
|
}
|
||||||
@ -149,29 +148,8 @@ function convertCellValue({value, type}) {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {SheetRawContent} rawContent
|
|
||||||
* @returns {any[]}
|
|
||||||
*/
|
|
||||||
export function rawContentToObjects(rawContent){
|
|
||||||
let [firstRow, ...dataRows] = rawContent
|
|
||||||
|
|
||||||
/** @type {string[]} */
|
|
||||||
//@ts-expect-error this type is correct after the filter
|
|
||||||
const columns = firstRow.filter(({value}) => typeof value === 'string' && value.length >= 1).map(r => r.value)
|
|
||||||
|
|
||||||
return dataRows
|
|
||||||
.map(row => {
|
|
||||||
const obj = Object.create(null)
|
|
||||||
columns.forEach((column, i) => {
|
|
||||||
const rawValue = row[i]
|
|
||||||
obj[column] = rawValue ? convertCellValue(rawValue) : ''
|
|
||||||
})
|
|
||||||
return obj
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -191,6 +169,37 @@ export function tableRawContentToValues(rawContentSheets){
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert values to strings
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {SheetCellRawContent} rawContentCell
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
export function cellRawContentToStrings(rawContentCell){
|
||||||
|
return rawContentCell.value || ''
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {SheetRowRawContent} rawContentRow
|
||||||
|
* @returns {string[]}
|
||||||
|
*/
|
||||||
|
export function rowRawContentToStrings(rawContentRow){
|
||||||
|
return rawContentRow.map(cellRawContentToStrings)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {SheetRawContent} rawContentSheet
|
||||||
|
* @returns {string[][]}
|
||||||
|
*/
|
||||||
|
export function sheetRawContentToStrings(rawContentSheet){
|
||||||
|
return rawContentSheet.map(rowRawContentToStrings)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param {Map<SheetName, SheetRawContent>} rawContentSheets
|
* @param {Map<SheetName, SheetRawContent>} rawContentSheets
|
||||||
@ -199,17 +208,45 @@ export function tableRawContentToValues(rawContentSheets){
|
|||||||
export function tableRawContentToStrings(rawContentSheets){
|
export function tableRawContentToStrings(rawContentSheets){
|
||||||
return new Map(
|
return new Map(
|
||||||
[...rawContentSheets].map(([sheetName, rawContent]) => {
|
[...rawContentSheets].map(([sheetName, rawContent]) => {
|
||||||
return [
|
return [ sheetName, sheetRawContentToStrings(rawContent) ]
|
||||||
sheetName,
|
|
||||||
rawContent
|
|
||||||
.map(row => row.map(c => (c.value || '')))
|
|
||||||
]
|
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert rows to objects
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function expects the first row to contain string values which are used as column names
|
||||||
|
* It outputs an array of objects which keys are
|
||||||
|
*
|
||||||
|
* @param {SheetRawContent} rawContent
|
||||||
|
* @returns {any[]}
|
||||||
|
*/
|
||||||
|
export function sheetRawContentToObjects(rawContent){
|
||||||
|
let [firstRow, ...dataRows] = rawContent
|
||||||
|
|
||||||
|
/** @type {string[]} */
|
||||||
|
//@ts-expect-error this type is correct after the filter
|
||||||
|
const columns = firstRow.filter(({value}) => typeof value === 'string' && value.length >= 1).map(r => r.value)
|
||||||
|
|
||||||
|
return dataRows
|
||||||
|
.map(row => {
|
||||||
|
const obj = Object.create(null)
|
||||||
|
columns.forEach((column, i) => {
|
||||||
|
const rawValue = row[i]
|
||||||
|
obj[column] = rawValue ? convertCellValue(rawValue) : ''
|
||||||
|
})
|
||||||
|
return obj
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param {Map<SheetName, SheetRawContent>} rawContentSheets
|
* @param {Map<SheetName, SheetRawContent>} rawContentSheets
|
||||||
@ -218,12 +255,18 @@ export function tableRawContentToStrings(rawContentSheets){
|
|||||||
export function tableRawContentToObjects(rawContentSheets){
|
export function tableRawContentToObjects(rawContentSheets){
|
||||||
return new Map(
|
return new Map(
|
||||||
[...rawContentSheets].map(([sheetName, rawContent]) => {
|
[...rawContentSheets].map(([sheetName, rawContent]) => {
|
||||||
return [sheetName, rawContentToObjects(rawContent)]
|
return [sheetName, sheetRawContentToObjects(rawContent)]
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Emptiness
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {SheetCellRawContent} rawCellContent
|
* @param {SheetCellRawContent} rawCellContent
|
||||||
* @returns {boolean}
|
* @returns {boolean}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user