[英]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.