生态产品多个设计器现已发布候选版本

查看生态总览
跳转到内容

导出 ​

查看器的 export(format, options?) 把此刻的计算结果写成文件,交回 Blob 或字符串。内置的是 Excel 工作簿 xlsx;扩展可以登记别的格式。导出用的就是屏幕上这一份结果:当时的参数、联动选中与卡片筛选都已经算在里面,不会再取一次数。

ts
const button = document.createElement('button')
button.type = 'button'
button.textContent = '导出 Excel'
button.addEventListener('click', async () => {
  const blob = await viewer.export('xlsx', { name: '销售汇总' }) as Blob
  const link = document.createElement('a')
  link.href = URL.createObjectURL(blob)
  link.download = '分区域销售汇总.xlsx'
  link.click()
  URL.revokeObjectURL(link.href)
})

导出了什么 ​

报表主体工作簿
明细表、分组报表、交叉表一张表,表名取 options.name,缺省取报表标题
看板每张已算好的表格卡片一张表,表名取卡片标题,重名时加序号;图表与指标卡片不导出
  • 明细表:首行是列标题,之后每行一条明细,有汇总时末行写合计。
  • 分组报表:前几列是各级分组,组头写组的键、组尾写小计,末尾写总计;不列明细时每组一行。
  • 交叉表:上方是列方向的多层表头、左侧是行方向的多层表头,相同的上层成员合并单元格,小计与总计照屏幕上的位置写。
  • 表头冻结;列宽按报表里写的列宽换算;数值按值格式换成 Excel 的数字格式,表达不了的写成格式化好的文本;日期写成日期单元格。

还没有可导出的表格(比如看板里只有图表)时,export('xlsx') 以 RangeError 拒绝;没有导出器认这种格式时同样以 RangeError 拒绝。写出工作簿的代码在第一次导出时才加载,不导出的页面不会下载它。

自己组织工作簿 ​

要把几张报表放进同一个工作簿、或自己决定表名,用 @xihan-report/runtime/xlsx 把视图的计算结果排成工作表,再交给 @xihan-ui/xlsx 写出:

ts
import { crosstabSheet, groupSheet, tableSheet } from '@xihan-report/runtime/xlsx'
import { writeXlsx, xlsxBlob } from '@xihan-ui/xlsx'

function sheetOf(view: ViewResult, name: string): XlsxSheet {
  const options = { dataset: view.dataset, name, timeZone: 'Asia/Shanghai' }
  if (view.type === 'table')
    return tableSheet(view.view, view.result, options)
  if (view.type === 'group')
    return groupSheet(view.view, view.result, options)
  return crosstabSheet(view.view, view.result, options)
}

/** 每项是一个查看器与它那张表的表名。 */
export async function exportWorkbook(entries: readonly (readonly [XhReportViewer, string])[]): Promise<Blob> {
  const sheets: XlsxSheet[] = []
  for (const [viewer, name] of entries) {
    const body = viewer.getResults().body
    if (body && 'type' in body)
      sheets.push(sheetOf(body, name))
  }
  return xlsxBlob(await writeXlsx({ sheets }))
}

tableSheet、groupSheet、crosstabSheet 与内置导出排出的工作表完全一样;getResults() 给出每个查看器此刻的计算结果。

别的格式 ​

导出器是扩展的一部分:扩展登记 exporters,写明能导出的格式与导出函数,export(format) 交给登记了这种格式的第一个导出器,内置的 xlsx 在最前。导出器拿到的上下文里有报表定义、getResults() 的结果、文案、时区与调用方给的 options。

Released under The MIT License