fix: 部分引用, 如果有公式会导致数据不对的bug

This commit is contained in:
雷军 2023-10-26 10:49:42 +08:00
parent 2f07ac858c
commit 26bc3210e4
4 changed files with 112 additions and 12 deletions

View file

@ -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",

View file

@ -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,

View file

@ -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<string, any>();
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<string, any>();
if (rowsData) {
var cellsData = new Map<string, any>();
@ -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) {

94
src/utils/alphabet.js Normal file
View file

@ -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,
};