请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

jerrychen3168
金牌服务用户   /  发表于:2025-3-28 09:58  /   查看:136  /  回复:5
1金币
本帖最后由 Wilson.Zhang 于 2025-4-18 15:13 编辑

你好,

使用 spread_import.import
但匯入檔案後,原本Excel的外部連結會消失 , 如附件

原始檔
image.png371249694.png

匯入后
image.png62962340.png

INVI02_2.XLSX

12.78 KB, 下载次数: 7

最佳答案

查看完整内容

您好!分析並運行您提供的代碼片段復現了問題現象,發現原因如下: 在您自定義的removeOtherWorksheet方法中,在臨時copiedWorkbook中反序列化spread_import,然後將除“單頭資料”sheet外的其他sheet刪除。然而,“單頭資料”sheet中J1單元格引用了“工作表1”sheet的C4,由於“工作表1”被刪除了,所以引用關係不存在。對應地,此時spread_import中僅存的sheet“單頭資料”中J1單元格的内容即變爲“#REF!”。這便是原因所在 ...

5 个回复

倒序浏览
最佳答案
最佳答案
Wilson.Zhang
超级版主   /  发表于:2025-3-28 09:59:00
来自 6#
jerrychen3168 发表于 2025-3-29 09:08
你好,試了下,还是需要協助,請幫忙

   

您好!分析並運行您提供的代碼片段復現了問題現象,發現原因如下:

在您自定義的removeOtherWorksheet方法中,在臨時copiedWorkbook中反序列化spread_import,然後將除“單頭資料”sheet外的其他sheet刪除。然而,“單頭資料”sheet中J1單元格引用了“工作表1”sheet的C4,由於“工作表1”被刪除了,所以引用關係不存在。對應地,此時spread_import中僅存的sheet“單頭資料”中J1單元格的内容即變爲“#REF!”。這便是原因所在,如下圖所示,在removeOtherWorksheet方法處理“單頭資料”sheet時追加console語句跟蹤了J1單元格中内容的變化情況:
1743390043650.png441674804.png

從瀏覽器右側控制臺的打印語句來看,與上述内容一致:
1743390176164.png348681029.png

從代碼邏輯來看,僅是將外部xlsx文件中sheet挨個反序列化后添加到瀏覽器當前顯示的Workbook中,除了修改當前Workbook中與匯入文件中同名sheet的名稱,似乎沒有其他業務邏輯。請教下您想要實現怎樣的需求?
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-3-28 10:34:50
2#
您好!從匯入檔案后的内容來看,sheet”單頭資料“中J1單元格引用結果爲”#REF!“,這個結果的可能是刪除了被引用單元格或所在行列。

您在匯入檔案后是否有其他操作?從您提供的圖示中看到Excel文件中只有兩個sheet,而匯入檔案后在SpreadJS中出現了四個sheet。
回复 使用道具 举报
jerrychen3168
金牌服务用户   /  发表于:2025-3-28 14:56:47
3#
Wilson.Zhang 发表于 2025-3-28 10:34
您好!從匯入檔案后的内容來看,sheet”單頭資料“中J1單元格引用結果爲”#REF!“,這個結果的可能是刪除了 ...

你好,匯入外部Excel代碼如下,請查閱,應該是沒有做刪除的动作.

document.getElementById('selectedFile01').onchange = function () {
    var file = document.querySelector('#selectedFile01').files[0];
    if (!file) {
        return;
    }
    document.getElementById('txt_ImportExcel').innerHTML = file.name;
    var fileType = getFileType(file);
    var options = getOptions('open');
    //spread.import(file, function () { }, function () { }, options);
    spread_import.import(file, function () {
        //spread_import 資料轉出json
        for (var i = 0; i < spread_import.getSheetCount(); i++) {
            var ls_SheetName = spread_import.getSheet(i).name();
            //檢查現有的Sheet是否已存在,若存在先改名
            for (var j = 0; j < spread.getSheetCount(); j++) {
                var ls_OrgSheetName = spread.getSheet(j).name();
                if (ls_SheetName == ls_OrgSheetName) {
                    var myDate = new Date();
                    var ls_Tmp = myDate.getFullYear().toString() + (myDate.getMonth() + 1).toString() + myDate.getDate().toString()
                        + "_" + myDate.getHours().toString() + myDate.getMinutes().toString() + myDate.getSeconds().toString();
                    var ls_OrgSheetName_new = ls_OrgSheetName + '_' + ls_Tmp;
                    spread.commandManager().execute({ cmd: "renameSheet", sheetName: ls_OrgSheetName, name: ls_OrgSheetName_new });
                    alert('Sheet [ ' + ls_OrgSheetName + ' ] Repeat! the orginal sheet renamed [ ' + ls_OrgSheetName_new + ' ].');
                }
            }
            //var copiedWorkbook = removeOtherWorksheet(spread_import, spread_import.getActiveSheet().name());
            var copiedWorkbook = removeOtherWorksheet(spread_import, ls_SheetName);
            importSsjsonA(spread, copiedWorkbook);
        }
        return;

    }, function () {
    }, options);

};
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-3-28 16:00:16
4#
jerrychen3168 发表于 2025-3-28 14:56
你好,匯入外部Excel代碼如下,請查閱,應該是沒有做刪除的动作.

document.getElementById('selectedFile ...

您提供的代碼片段無異常,代碼中的spread_import和spread哪一個是在瀏覽器可見的?如果spread_import是不可見的那個,那麽可見的spread中與spread_import中各sheet名稱相同的sheet被修改了名稱,如下圖所示:
1743148646025.png170609130.png

且匯入后刪除了spread_import中除當前活動sheet外的其他sheet並得到copiedWorkbook,再之後將copiedWorkbook匯入了spread中,如下圖所示:
1743148705846.png219704283.png

但是這部分代碼未提供,我只能根據removeOtherWorksheet方法的名字顧名思義,是否在這裏刪除了“工作表1”,您可以沿著這個方向排查下。如果需要幫助,您可以提供下removeOtherWorksheet和importSsjsonA方法的代碼,並介紹下您通過這些代碼要實現的業務,確保我能正確理解您的訴求。
回复 使用道具 举报
jerrychen3168
金牌服务用户   /  发表于:2025-3-29 09:08:01
5#
Wilson.Zhang 发表于 2025-3-28 16:00
您提供的代碼片段無異常,代碼中的spread_import和spread哪一個是在瀏覽器可見的?如果spread_import是不 ...

你好,試了下,还是需要協助,請幫忙
<div class="down-page">
    <!-- b) 创建SpreadJS的目标DOM元素,id为ss的HTML DIV-->
    <div id="ss" class="spread-container"></div>
    <div id="ss_import" class="spread-container" style="display:none"></div>
    <div class="options-container" style="display: none">
        <div class="option-row">
            <div class="inputContainer">
                <button class="settingButton" id="open">Open</button>

                <div class="open-options"></div>
            </div>
            <div class="inputContainer">
                <label for="fileType">FileType:</label>
                <select id="saveFileType">
                    <option value="xlsx">Excel</option>
                    <option value="csv">Csv</option>
                </select>
                <div class="save-options"></div>
            </div>
        </div>
    </div>
</div>

        const designer = new GC.Spread.Sheets.Designer.Designer('ss', config);
        const spread = designer.getWorkbook();
        const designer_import = new GC.Spread.Sheets.Designer.Designer('ss_import', config);
        const spread_import = designer_import.getWorkbook();
document.getElementById('selectedFile01').onchange = function () {
    var file = document.querySelector('#selectedFile01').files[0];
    if (!file) {
        return;
    }
    document.getElementById('txt_ImportExcel').innerHTML = file.name;
    var fileType = getFileType(file);
    var options = getOptions('open');
    //spread.import(file, function () { }, function () { }, options);
    spread_import.import(file, function () {
        //spread_import 資料轉出json
        for (var i = 0; i < spread_import.getSheetCount(); i++) {
            var ls_SheetName = spread_import.getSheet(i).name();
            //檢查現有的Sheet是否已存在,若存在先改名
            for (var j = 0; j < spread.getSheetCount(); j++) {
                var ls_OrgSheetName = spread.getSheet(j).name();
                if (ls_SheetName == ls_OrgSheetName) {
                    var myDate = new Date();
                    var ls_Tmp = myDate.getFullYear().toString() + (myDate.getMonth() + 1).toString() + myDate.getDate().toString()
                        + "_" + myDate.getHours().toString() + myDate.getMinutes().toString() + myDate.getSeconds().toString();
                    var ls_OrgSheetName_new = ls_OrgSheetName + '_' + ls_Tmp;
                    spread.commandManager().execute({ cmd: "renameSheet", sheetName: ls_OrgSheetName, name: ls_OrgSheetName_new });
                    alert('Sheet [ ' + ls_OrgSheetName + ' ] Repeat! the orginal sheet renamed [ ' + ls_OrgSheetName_new + ' ].');
                }
            }
            var copiedWorkbook = removeOtherWorksheet(spread_import, ls_SheetName);
            importSsjsonA(spread, copiedWorkbook);
        }
        return;
    }, function () {
        
    }, options);

};

function removeOtherWorksheet(spread, sheetName) {
    var copiedWorkbook = new GC.Spread.Sheets.Workbook();
    copiedWorkbook.fromJSON(spread.toJSON());
    var sheetNames = [];
    for (var i = 0; i < copiedWorkbook.getSheetCount(); i++) {
        if (copiedWorkbook.getSheet(i).name() !== sheetName) {
            sheetNames.push(copiedWorkbook.getSheet(i).name());
        }
    }
    console.log('sheetNames: ', sheetNames);
    sheetNames.forEach(curSheetName => {
        if (curSheetName !== sheetName) {
            console.log('remove sheet: ', curSheetName, ', index: ', copiedWorkbook.getSheetIndex(curSheetName));
            copiedWorkbook.removeSheet(copiedWorkbook.getSheetIndex(curSheetName));
        }
    });
    console.log('剩余的Worksheet: ');
    for (var i = 0; i < copiedWorkbook.getSheetCount(); i++) {
        console.log(copiedWorkbook.getSheet(i).name());
    }

    return copiedWorkbook;
}

function importSsjsonA(spread, copiedWorkbook) {
    //console.log('enter import ssjson: ', workbookJSON);
    //var copiedWorkbook = new GC.Spread.Sheets.Workbook();
    //copiedWorkbook.fromJSON(workbookJSON);
    var copiedWorksheet = new GC.Spread.Sheets.Worksheet();
    copiedWorksheet.fromJSON(copiedWorkbook.getSheet(0).toJSON());
    var namedStyles = copiedWorkbook.getNamedStyles();
    if (namedStyles) {
        namedStyles.forEach(namedStyle => copiedWorksheet.addNamedStyle(namedStyle));
    }
    console.log('ready add sheet');
    console.log('copiedWorksheet.name = ', copiedWorksheet.name());
    spread.addSheet(spread.getSheetCount(), copiedWorksheet);
    spread.setActiveSheetIndex(spread.getSheetCount() - 1);
    console.log('finished add sheet');
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部