From 26bc3210e4af9bc73628efbc95890e0d83875ed2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E5=86=9B?= Date: Thu, 26 Oct 2023 10:49:42 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=83=A8=E5=88=86=E5=BC=95=E7=94=A8,=20?= =?UTF-8?q?=E5=A6=82=E6=9E=9C=E6=9C=89=E5=85=AC=E5=BC=8F=E4=BC=9A=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E6=95=B0=E6=8D=AE=E4=B8=8D=E5=AF=B9=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- manifest.json | 2 +- src/ExcelView.ts | 2 +- src/utils/DataUtils.ts | 26 +++++++----- src/utils/alphabet.js | 94 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 112 insertions(+), 12 deletions(-) create mode 100644 src/utils/alphabet.js diff --git a/manifest.json b/manifest.json index c370d59..a76a9ed 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "excel", "name": "Excel", - "version": "1.3.6", + "version": "1.3.7", "minAppVersion": "0.15.0", "description": "Create spreadsheets and easily embed them in Markdown", "author": "ljcoder", diff --git a/src/ExcelView.ts b/src/ExcelView.ts index f00b9a2..66aace9 100644 --- a/src/ExcelView.ts +++ b/src/ExcelView.ts @@ -192,7 +192,7 @@ export class ExcelView extends TextFileView { showBottomBar: true, view: { height: () => this.contentEl.clientHeight, - width: () => this.contentEl.clientWidth, + width: () => this.contentEl.clientWidth - 32, }, row: { len: 100, diff --git a/src/utils/DataUtils.ts b/src/utils/DataUtils.ts index d8228a7..4a6a222 100644 --- a/src/utils/DataUtils.ts +++ b/src/utils/DataUtils.ts @@ -1,5 +1,6 @@ import { Notice } from "obsidian"; import { t } from "../lang/helpers" +import { expr2expr } from "../utils/alphabet" /** * 获取 sheet 数据 * @param data markdown 文件原始data @@ -32,19 +33,14 @@ export const getExcelAreaData = ( const excelData = getExcelData(data) || "{}"; const jsonData = JSON.parse(excelData) || []; - var sri: number | null = null; - var sci: number | null = null; - var eri: number | null = null; - var eci: number | null = null; - var cellArray = cells.split(":"); const start = cellArray[0].split("-"); - sri = parseInt(start[0]); // 开始行 - sci = parseInt(start[1]); // 开始列 + var sri = parseInt(start[0]); // 开始行 + var sci = parseInt(start[1]); // 开始列 const end = cellArray[1].split("-"); - eri = parseInt(end[0]); // 结束行 - eci = parseInt(end[1]); // 结束列 + var eri = parseInt(end[0]); // 结束行 + var eci = parseInt(end[1]); // 结束列 var newData = new Map(); newData.set("name", sheet); @@ -65,7 +61,7 @@ export const getExcelAreaData = ( for (var row = 0; row <= eri - sri; row++) { // 获取原始 row 的数据 const rowsData = sheetData.rows[`${row + sri}`]; - console.log("getExcelAreaData", sheetData, rowsData, row + eri); + // console.log("getExcelAreaData", sheetData, rowsData, row + eri); var newCells = new Map(); if (rowsData) { var cellsData = new Map(); @@ -74,6 +70,16 @@ export const getExcelAreaData = ( // 获取原始 当前 [row, col] 的数据 const cell = rowsData.cells[`${col + sci}`]; if (cell) { + // 如果当前cell是公式 + if (cell.text) { + var text = cell.text as String + if (text && text[0] === '=') { + // console.log('cell text', text, sri, sci) + cell.text = text.replace(/[a-zA-Z]{1,3}\d+/g, word => expr2expr(word, -sci, -sri, (x, y) => x >= sci && y >= sri)); + // console.log('update cell text', cell.text) + } + } + cellsData.set(`${col}`, cell); // 是否有合并单元格的数据 if (row == eri - sri && cell.merge) { diff --git a/src/utils/alphabet.js b/src/utils/alphabet.js new file mode 100644 index 0000000..9870198 --- /dev/null +++ b/src/utils/alphabet.js @@ -0,0 +1,94 @@ +const alphabets = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']; + +/** index number 2 letters + * @example stringAt(26) ==> 'AA' + * @date 2019-10-10 + * @export + * @param {number} index + * @returns {string} + */ +export function stringAt(index) { + let str = ''; + let cindex = index; + while (cindex >= alphabets.length) { + cindex /= alphabets.length; + cindex -= 1; + str += alphabets[parseInt(cindex, 10) % alphabets.length]; + } + const last = index % alphabets.length; + str += alphabets[last]; + return str; +} + +/** translate letter in A1-tag to number + * @date 2019-10-10 + * @export + * @param {string} str "AA" in A1-tag "AA1" + * @returns {number} + */ +export function indexAt(str) { + let ret = 0; + for (let i = 0; i < str.length - 1; i += 1) { + const cindex = str.charCodeAt(i) - 65; + const exponet = str.length - 1 - i; + ret += (alphabets.length ** exponet) + (alphabets.length * cindex); + } + ret += str.charCodeAt(str.length - 1) - 65; + return ret; +} + +// B10 => x,y +/** translate A1-tag to XY-tag + * @date 2019-10-10 + * @export + * @param {tagA1} src + * @returns {tagXY} + */ +export function expr2xy(src) { + let x = ''; + let y = ''; + for (let i = 0; i < src.length; i += 1) { + if (src.charAt(i) >= '0' && src.charAt(i) <= '9') { + y += src.charAt(i); + } else { + x += src.charAt(i); + } + } + return [indexAt(x), parseInt(y, 10) - 1]; +} + +/** translate XY-tag to A1-tag + * @example x,y => B10 + * @date 2019-10-10 + * @export + * @param {number} x + * @param {number} y + * @returns {tagA1} + */ +export function xy2expr(x, y) { + return `${stringAt(x)}${y + 1}`; +} + +/** translate A1-tag src by (xn, yn) + * @date 2019-10-10 + * @export + * @param {tagA1} src + * @param {number} xn + * @param {number} yn + * @returns {tagA1} + */ +export function expr2expr(src, xn, yn, condition = (x, y) => true) { + if (xn === 0 && yn === 0) return src; + const [x, y] = expr2xy(src); + // console.log('expr2xy', x, y ,src) + if (!condition(x, y)) return src; + return xy2expr(x + xn, y + yn); +} + +export default { + stringAt, + indexAt, + expr2xy, + xy2expr, + expr2expr, +};