c# - 为什么 EPPLUS 删除了我的 excel 文件?

标签 c# epplus

我正在使用 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/

相关文章:

c# - 仅去除字符串中数字包围的逗号

c# - 如何从 JObject 中按键获取值?

c# - 如何转义公式中的双引号

c# - "Promote"泛型类型在 C# 中为 Nullable?

c# - Steam 授权

c# - EPPlus 未正确插入配方

c# - 如何将公式应用于 EPPLUS Core 中的整列?

Powershell:存储在变量中的属性

c# - 在 Excel、EPPlus、C# 中以编程方式隐藏选项卡

c# - EPPlus 中的多个图表