簡體   English   中英

C# SpreadsheetLight 在保存后損壞 excel 文件

[英]C# SpreadsheetLight corrupts excel file after save

由於在 .network 上運行 .xlsm 文件的一些問題,決定不再使用 VBA 並開發將編輯常規 excel 文件的獨立應用程序。 由於我有一些 C# 和 Visual Studio 知識,所以我決定使用這些工具。 由於 Iterop.Excel 真的很慢,我決定使用 SpreadsheetLight。

在讀取和分析數據期間一切順利,但在我添加了一些記錄並保存文件后,文件損壞了:當嘗試使用 excel 打開時,我收到以下消息:

“我們發現某些內容存在問題。您希望我們盡可能多地恢復嗎?如果您信任此工作簿的來源,請單擊是”。 單擊“是”后,收到消息稱它已損壞,無法恢復。

即使我不添加任何記錄而只是保存文件也已損壞。

問題是文件在 OpenOffice 中打開時沒有任何問題,所有記錄都在那里。

任何幫助將不勝感激!

下面的class實現了excel文件的r/w:

class SPREADSHEET_TOOLS
{
    public string file_name;

    public SLDocument doc;

    public List<string> sheets;

    MemoryStream ms;

    public SPREADSHEET_TOOLS()
    {
        
        
    }   

    public bool init(string _file_name)
    {
        this.file_name = _file_name;
        ms = new MemoryStream();

        try
        {
            FileStream stream = File.Open(this.file_name, FileMode.Open);
            
            this.doc = new SLDocument(stream);
            this.sheets = doc.GetSheetNames();

            stream.Close();

            
        }
        catch (IOException)
        {
            MessageBox.Show("Fisierul este deschis de un alt utilizator. Nu poate fi accesat!!!!");
            return false;
        }
        return true;
    }

    public List<string>getUniqeRowValues(string sheet,int row)
    {
        List<string> values = new List<string>();

        if (this.sheets.Contains(sheet))
        {
            this.doc.SelectWorksheet(sheet);
            while (this.doc.GetCellValueAsString(row, 1) != "")
            {
                if (values.Count == 0)
                {
                    values.Add(this.doc.GetCellValueAsString(row, 1));
                }
                else
                {
                    if (!values.Contains(this.doc.GetCellValueAsString(row, 1)))
                    {
                        values.Add(this.doc.GetCellValueAsString(row, 1));
                    }
                }

                row++;
            }

        }

        return values;
    }

    public List<string>getChildValues(string sheet, string parent, int row, int column_parent, int column_child)
    {
        List<string> values = new List<string>();
        if (this.sheets.Contains(sheet))
        {
            this.doc.SelectWorksheet(sheet);
            while (this.doc.GetCellValueAsString(row, column_parent) != "")
            {
                if (this.doc.GetCellValueAsString(row, column_parent) == parent)
                {
                    values.Add(this.doc.GetCellValueAsString(row, column_child));
                }
                row++;
            }
        }
            return values;
    }
    public int getLastRow(string sheet)
    {
        int row=0;
        
        if (this.sheets.Contains(sheet))
        {
            this.doc.SelectWorksheet(sheet);
            row = 1;
            while (this.doc.GetCellValueAsString(row, 1) != "")
            {
                row++;
            }
        }
        return row;
    }
    
    public bool writeRow(string[] data, string sheet,int row)
    {
        if (this.sheets.Contains(sheet))
        {
            this.doc.SelectWorksheet(sheet);
            for (int i=0; i < data.Length; i++)
            {
                InlineString str = new InlineString();

                
                //bool a = this.doc.SetCellValue(row,i+1,data[i]);

            }
            //this.doc.SaveAs(this.ms);
            foreach (string s in this.sheets)
            {
                this.doc.SelectWorksheet(s);
                
            }
            this.doc.DocumentProperties.Creator = "CP";
            this.doc.SaveAs("E:\\C-SHARP\\PONTAJ\\PONTAJ\\BUBU.XLSX");
            MessageBox.Show("Saved!");

            return true;
        } 

        return false;
    }
}

我也遇到了同樣的問題,Excel 文件在下載后損壞。 所以我做了一些修復並將 SpreadSheetLight 代碼更新為 .NET 6。

您可以從這里下載源代碼: https://github.com/bhavinvachhani403/SpreadSheetLight_Net6.0

我希望這會幫助你解決你的問題。

我有同樣的錯誤,我通過將 DocumentFormat.OpenXml 的版本更改為 2.5 版來解決它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM