# EXCEL

# 导入

通过如下方式导入excel api

import excel from "svr-api/excel";

# 方法

/**
 * 读取和生成Excel文件的相关API
 */
import { File } from "./fs";

/**
 * 读取excel文件数据到json格式。
 * 
 * @returns `SheetJSONData` 数组
 */
export function readExcelToJSON(args: {
	/**excel文件路径、或文件流 */
	excelFile: string | File | InputStream;
	/**读取哪个sheet,可传递序号(0开始)或sheet名,不传递时读取所有sheet */
	sheet?: string | number;
    /**如何分析列名
     * 1. `auto` 自动分析,系统自动根据excel的数据格式,分析出数据区域和列头区域
     */
	columnName?: "auto" | "firstRow" | "none";
	/**文件拓展名,用于文件名本身不带后缀的情况下补充说明。 */
	fileExtension?: "xls" | "xlsx";
	/**每个sheet的最大行数,sheet数据行超过限制则截取前sheetMaxRow行。 */
	sheetMaxRow?: number;

}): SheetJSONData[];

/**excel一个sheet的数据转换成的json */
export interface SheetJSONData {
	/**sheet名称 */
	sheetName: string;
	/**数据行行数 */
	rowCount: number;
	/**列数 */
	colCount: number;
	/**所有的列名,当无法分析列名是为空 */
	columns: TableFieldMetadata[];
	/**所有的单元格的数据,如果能正确分析列头,那么只包含数据区域的数据 */
	rows: any[][];
}

/**
 * 打开一个excel文件。支持读取excel数据。
 * 
 * @param excelFile excel文件路径、或文件流
 * @returns 返回一个`poi`的[Workbook](https://poi.apache.org/apidocs/dev/org/apache/poi/ss/usermodel/Workbook.html)接口。
 */
export function openExcelFile(args: {excelFile: string | File | InputStream}): Workbook;

/**
 * 创建一个新的excel工作表对象,用于创建新的excel文件。
 */
export function createWorkbook(): Workbook;

/**
 * TODO
 * 保持excel文件 
 */
export function saveExcelFile(workbook: Workbook, excelFile: string | File): void;


/** 提供一些常用的工具方法*/

/**
 * 判断是否为日期,excel的日期以数值类型存储,但可以通过显示格式判断出是否为日期。
 */
export function isDate(cell: Cell): boolean;

/**
 * 判断是否为日期,excel的时间以数值类型存储,但可以通过显示格式判断出是否为时间。
 */
export function isTime(cell: Cell): boolean;

/**
 * excel工作簿,代表一个excel文件。
 * 参考 <https://poi.apache.org/apidocs/dev/org/apache/poi/ss/usermodel/Workbook.html> 把常用的接口定义出来
 */
export interface Workbook {
	/**
	 * 关闭工作簿,并关闭使用的所有流,请务必在使用结束、或发生异常后调用本方法。
	 */
	close: () => void;

	/**
	 * 获取excel的sheet数量。
	 */
	getNumberOfSheets: () => number;

	/**
	 * 获取第index(从0开始)个sheet。
	 * @throws IllegalArgumentException 如果index小于0或者大于最大数量。
	 */
	getSheetAt: (index: number) => Sheet;

	/**
	 * 获取名为name的sheet。
	 */
	getSheet: (name: string) => Sheet;


	/**不常用的函数都通过这个访问,避免出现编译错误 */
	[anything: string]: any;
}

/**
 * excel工作表,一个workbook包含一个或多个sheet。
 */
export interface Sheet {
	/**
	 * 获取逻辑上的数据行(从0开始),若获取的行未定义则返回null。
	 */
	getRow: (rowNum: number) => Row;

	/**
	 * 获取当前sheet名称。
	 */
	getSheetName: () => string;

	/**
	 * 获取首行的序号(从0开始)。
	 */
	getFirstRowNum: () => number;

	/**
	 * 获取最后一行的序号(从0开始)。
	 */
	getLastRowNum: () => number;

	/**
	 * 获取所有合并单元格的范围。
	 * @returns List<org.apache.poi.ss.util.CellRangeAddress>
	 */
	getMergedRegions: () => Array<MergeRegion>;

	/** 更多参见,org.apache.poi.ss.usermodel.Sheet*/
	[anything: string]: any;
}


export interface Row {
	/**
	 * 获取第cellNum列的单元格,若该列未定义,则返回null。
	 */
	getCell: (cellNum: number) => Cell;

	/**
	 * 获取定义的第一个单元格序号。
	 */
	getFirstCellNum: () => number;

	/**
	 * 获取定义的最后一个单元格的序号。
	 */
	getLastCellNum: () => number;

	/** 更多参见,org.apache.poi.ss.usermodel.Row*/
	[anything: string]: any;
}

export interface Cell {

	/**
	 * 获取单元格类型
	 */
	getType: () => CellType;

	/**
	 * 获取double类型的值。
	 * @throws 若单元格不能解析为double,则抛出NumberFormatException异常。
	 */
	getNumericCellValue: () => number;

	/**
	 * 获取string类型的值。
	 */
	getStringCellValue: () => string;

	/**
	 * 获取boolean类型的值。
	 *@throws 若{@link #getCellType()}的返回值不是{@link CellType#BOOLEAN}、{@link CellType#BLANK}或{@link CellType#FORMULA},则抛出IllegalStateException异常。
	 */
	getBooleanCellValue: () => boolean;

	/** 更多参见,org.apache.poi.ss.usermodel.Cell*/
	[anything: string]: any;
}

/**
 * excel工作表中的合并单元格区域。
 */
export interface MergeRegion {
	getFirstColumn: () => number;
	getLastColumn: () => number;
	getFirstRow: () => number;
	getLastRow: () => number;
	isInRange: (rowInd: number, colInd: number) => boolean;
}


/**
 * 单元格数据存储类型。
 */
 export const enum CellType {
	/** 数值类型 */
	NUMERIC = "NUMERIC",

	/** 字符串类型 */
	STRING = "STRING",

	/** 布尔类型 */
	BOOLEAN = "BOOLEAN",
	
	/** 空值 */
	BLANK = "BLANK",

	/** 计算公式 */
	FORMULA = "FORMULA",

	/** 异常单元格 */
	ERROR = "ERROR"
}
是否有帮助?
0条评论
评论