mirror of
https://github.com/ljcoder2015/obsidian-excel.git
synced 2026-07-22 08:30:28 +00:00
fix: 部分引用, 如果有公式会导致数据不对的bug
This commit is contained in:
parent
2f07ac858c
commit
26bc3210e4
4 changed files with 112 additions and 12 deletions
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
94
src/utils/alphabet.js
Normal 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,
|
||||
};
|
||||
Loading…
Reference in a new issue