在json_to_sheet之后使用XLSX js排序和过滤列

时间:2019-07-02 13:57:18

标签: javascript excel typescript angular5 xlsx-js

我正在使用这个xlsx js库从Angular5应用程序中的TypeScript对象列表生成Excel文件。

我不需要TypeScript对象的所有属性,而是想以特定方式对其他属性进行排序。

以简单的TypeScript对象列表为例:

[
  { 
    "id":"one",
    "location":"New York",
    "metadata":"just other infos",
    "name":"John",
  },
  { 
    "id":"two",
    "location":"Boston",
    "metadata":"just other infos",
    "name":"Mark",
  },
  { 
    "id":"three",
    "location":"Portland",
    "metadata":"just other infos",
    "name":"Samy",
  }
]

想要的Excel输出:

|id    |name |location |
|one   |John |New York |
|two   |Mark |Boston   |
|three |Samy |Portland |

到目前为止,我有什么(可以的):

const workbook = XLSX.utils.book_new();
const myHeader = ["id","name","location"];
const worksheet = XLSX.utils.json_to_sheet(this.myListOfObjects(), {header: myHeader});
XLSX.utils.book_append_sheet(workbook, worksheet, 'tab1');
XLSX.writeFile(workbook, 'excel_export.xlsb');

但这会生成以下excel文件:

|id    |name |location |metadata        |
|one   |John |New York |just other infos|
|two   |Mark |Boston   |just other infos|
|three |Samy |Portland |just other infos|

我的问题是所有未列出的属性都只是在末尾追加。

我不能/不能更改我的TypeScript对象。我不想将工作表转换回数组。

1 个答案:

答案 0 :(得分:0)

我花了一段时间才找到这个简单的解决方案。还有其他可能性,但这是最简单的一种。

使用worksheet['!ref']

可以缩小excel文件的范围

所以我将范围从“ A1:D4”减小到了“ A1:B3”。为此,我使用了myHeader列表的长度(此列表应来自配置文件)。

const range = XLSX.utils.decode_range(worksheet['!ref']);
range.e['c'] = myHeader.length - 1;
worksheet['!ref'] = XLSX.utils.encode_range(range);

完整的代码段:

const workbook = XLSX.utils.book_new();
const myHeader = ["id","name","location"];
const worksheet = XLSX.utils.json_to_sheet(this.myListOfObjects(), {header: myHeader});

const range = XLSX.utils.decode_range(worksheet['!ref']);
range.e['c'] = myHeader.length - 1;
worksheet['!ref'] = XLSX.utils.encode_range(range);

XLSX.utils.book_append_sheet(workbook, worksheet, 'tab1');
XLSX.writeFile(workbook, 'excel_export.xlsb');

等等,这将生成以下excel文件:

|id    |name |location |
|one   |John |New York |
|two   |Mark |Boston   |
|three |Samy |Portland |

您有更好的解决方案吗?请分享:)