我正在使用 epplus 库来读/写 excel 文件。我的程序每 X 秒将数据写入 excel 文件(自动写入 excel)。
而前几天,当excel中的数据数量达到大约2800条时,我的excel文件被删除了,我不知道为什么。我知道是因为我的程序给我异常消息,我检查我的 excel 文件已被删除。
然后我看了epplus的源码,我觉得有一个删除excel文件的程序。这是示例代码
public void Save()
{
try
{
Workbook.Save();
if (File == null)
{
if(Encryption.IsEncrypted)
{
#if !MONO
var ms = new MemoryStream();
_package.Save(ms);
byte[] file = ms.ToArray();
EncryptedPackageHandler eph = new EncryptedPackageHandler();
var msEnc = eph.EncryptPackage(file, Encryption);
CopyStream(msEnc, ref _stream);
#endif
#if MONO
throw new NotSupportedException("Encryption is not supported under Mono.");
#endif
}
else
{
_package.Save(_stream);
}
_stream.Flush();
_package.Close();
}
else
{
if (System.IO.File.Exists(File.FullName))
{
try
{
System.IO.File.Delete(File.FullName);
}
catch (Exception ex)
{
throw (new Exception(string.Format("Error overwriting file {0}", File.FullName), ex));
}
}
_package.Save(_stream);
_package.Close();
if (Stream is MemoryStream)
{
var fi = new FileStream(File.FullName, FileMode.Create);
//EncryptPackage
if (Encryption.IsEncrypted)
{
#if !MONO
byte[] file = ((MemoryStream)Stream).ToArray();
EncryptedPackageHandler eph = new EncryptedPackageHandler();
var ms = eph.EncryptPackage(file, Encryption);
fi.Write(ms.GetBuffer(), 0, (int)ms.Length);
#endif
#if MONO
throw new NotSupportedException("Encryption is not supported under Mono.");
#endif
}
else
{
fi.Write(((MemoryStream)Stream).GetBuffer(), 0, (int)Stream.Length);
}
fi.Close();
}
else
{
System.IO.File.WriteAllBytes(File.FullName, GetAsByteArray(false));
}
}
}
catch (Exception ex)
{
if (File == null)
{
throw;
}
else
{
throw (new InvalidOperationException(string.Format("Error saving file {0}", File.FullName), ex));
}
}
}
那么,我的 excel 文件是否被删除了? 还有epplus删除excel文件的原因是什么? (根据此示例代码) 这些是一些异常(exception)
System.InvalidOperationException: Error saving file E:\Test\Morning.xlsx --->
System.Xml.XmlException: There is an unclosed literal string. Line 1, position 8190.
at System.Xml.XmlTextReaderImpl.Throw(String res, String arg)
at System.Xml.XmlTextReaderImpl.ParseAttributeValueSlow(Int32 curPos, Char quoteChar, NodeData attr)
at System.Xml.XmlTextReaderImpl.ParseAttributes()
at System.Xml.XmlTextReaderImpl.ParseElement()
at System.Xml.XmlTextReaderImpl.ParseElementContent()
at OfficeOpenXml.ExcelWorksheet.LoadCells(XmlTextReader xr)
at OfficeOpenXml.ExcelWorksheet.CreateXml()
at OfficeOpenXml.ExcelWorksheet..ctor(XmlNamespaceManager ns,
ExcelPackage excelPackage, String relID, Uri uriWorksheet, String sheetName,
Int32 aheetID, Int32 positionID, eWorkSheetHidden hide)
at OfficeOpenXml.ExcelWorksheets..ctor(ExcelPackage pck,
XmlNamespaceManager nsm, XmlNode topNode)
at OfficeOpenXml.ExcelWorkbook.get_Worksheets()
at OfficeOpenXml.ExcelWorkbook.Save()
at OfficeOpenXml.ExcelPackage.Save()
--- End of inner exception stack trace ---
at OfficeOpenXml.ExcelPackage.Save()
at Monitoring.FMain.SaveEPPLUS()
...
System.ArgumentOutOfRangeException: Index was out of range.
Must be non-negative and less than the siza of the collection
最佳答案
我会说问题显然出在这段代码中:
if (System.IO.File.Exists(File.FullName))
{
try
{
System.IO.File.Delete(File.FullName);
}
catch (Exception ex)
{
throw (new Exception(string.Format("Error overwriting file {0}", File.FullName), ex));
}
}
_package.Save(_stream);
_package.Close();
if (Stream is MemoryStream)
{
var fi = new FileStream(File.FullName, FileMode.Create);
//EncryptPackage
if (Encryption.IsEncrypted)
{
#if !MONO
byte[] file = ((MemoryStream)Stream).ToArray();
EncryptedPackageHandler eph = new EncryptedPackageHandler();
var ms = eph.EncryptPackage(file, Encryption);
fi.Write(ms.GetBuffer(), 0, (int)ms.Length);
#endif
#if MONO
throw new NotSupportedException("Encryption is not supported under Mono.");
#endif
}
else
{
fi.Write(((MemoryStream)Stream).GetBuffer(), 0, (int)Stream.Length);
}
fi.Close();
}
else
{
System.IO.File.WriteAllBytes(File.FullName, GetAsByteArray(false));
}
您正在先删除文件然后重写它,这种情况是删除成功并且由于索引超出范围而重写文件失败(代码试图将空数据或不完整数据写入 excel)。
System.ArgumentOutOfRangeException: Index was out of range.
Must be non-negative and less than the siza of the collection
我建议您不要使用您的代码删除文件,无论如何您可能总是需要旧数据。
我会将上面的删除代码改成:
if (System.IO.File.Exists(File.FullName))
{
File.FullName=//FileName+date.now;
}
这样如果文件已经存在,不是删除它,而是用另一个名字创建一个新文件,这样你就可以保证你不会丢失旧数据。 我还建议在要写入的数据大小上添加一些条件,这样您的代码就不会再次导致索引超出范围异常。
关于c# - 为什么 EPPLUS 删除了我的 excel 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28523690/