【问题标题】:Create Excel file directly on FTP with C# using EPPlus library使用 EPPlus 库使用 C# 在 FTP 上直接创建 Excel 文件
【发布时间】:2018-06-25 13:29:20
【问题描述】:

我想在 FTP 服务器上创建一个 Excel 文件。我已经尝试在本地创建一个文件,它的工作原理是:如何在 FTP 而不是本地驱动器中创建它?

ExcelPkg.SaveAs(
  new FileInfo(@"C:\ExcelTest\" + DateTime.Now.ToString("yyyy-MM-dd--hh-mm-ss") + ".xlsx"))

我想直接在 FTP 中创建这个文件,而不是在本地创建,然后移动它。

【问题讨论】:

  • 什么问题?你没有说你尝试了什么,发生了什么,什么没有奏效。
  • 问题是如何在 FTP 服务器中创建我的 excel 文件,如何设置正确的路径。
  • ExcelPkg 是 C# 中的一个 excel 库,它被称为 EpPlus
  • 再一次,你没有说明你尝试了什么,发生了什么,什么没有奏效。如果你输入ExcelPkg.SaveAs(new FileInfo(YourFtpPath)) 会发生什么?
  • 什么都没有发生,代码编译时出现 0 错误,服务器上什么也没有显示

标签: c# .net excel ftp epplus


【解决方案1】:

使用ExcelPackage.SaveAs overload that accepts a Stream并传递一个FTP请求流,例如:
Upload a streamable in-memory document (.docx) to FTP with C#?


我现在无法测试 EPPlus,但这应该可以:

WebRequest request = WebRequest.Create("ftp://ftp.example.com/remote/path/sheet.xlsx");
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential(username, password);
using (Stream ftpStream = request.GetRequestStream())
{
    ExcelPkg.SaveAs(ftpStream);
}

【讨论】:

  • 这应该可以工作......但如果 OP 只是在本地创建文件然后将其作为单独的操作上传,这可能会更好。
  • 感谢您的解决方案,我认为这是正确的方向,但我现在收到一条错误消息“~无法连接到服务器”,这可能取决于加密:(加密:需要隐式FTP over TLS)对此有什么了解吗?
  • 试试request.EnableSsl = true;。如果这没有帮助,因为您的服务器确实需要隐式 TLS/SSL(非常罕见),您将不得不使用完全不同的解决方案 - stackoverflow.com/q/1842186/850848
  • @JoelCoehoorn 为什么?如果您有一个无需这样做的 API,那么在本地创建文件是没有意义的。通过依赖临时文件,您只是添加了另一个不必要的故障点。
【解决方案2】:

我必须进行 2 次不同的操作,第一次创建 Excel 文件,然后上传现有文件,然后将其删除。 使用名为 WinSCP 的库 我找不到任何同时支持 90 年代加密的库,例如基于 TLS 的隐式 FTP 和流 API。所以我没有办法直接在服务器上创建excel文件,而是在本地临时创建它来复制它并同时删除它,这几乎是我得到相同结果的结果。这是解决方案

try
{
    // Setup session options
    SessionOptions sessionOptions = new SessionOptions
    {
        Protocol = Protocol.Ftp,
        HostName = @"xx.xx.x.x",
        UserName = "xxxx",
        Password = "xxxxxx",
        PortNumber = xxxx,
        FtpSecure = FtpSecure.Implicit, //Encryption protocol
        GiveUpSecurityAndAcceptAnyTlsHostCertificate = true // Accepts any certificate
    };

    using (Session session = new Session())
    {
        // Connect
        session.Open(sessionOptions);

        // Upload files
        TransferOptions transferOptions = new TransferOptions();
        transferOptions.TransferMode = TransferMode.Binary;

        TransferOperationResult transferResult;
        // Copy's Existing file to Connected server and delets the old one.
        // change by replace "true" with "false".
        transferResult =
            session.PutFiles(
                ExistingPath, "/ScheduleJobs/" + RemotePath, true, transferOptions);

        // Throw on any error
        transferResult.Check();

        // Print results
        foreach (TransferEventArgs transfer in transferResult.Transfers)
        {
            Console.WriteLine("Upload of {0} succeeded", transfer.FileName);
            Console.ReadLine();
        }

    }

}
catch (Exception e)
{
    Console.WriteLine("Error: {0}", e);
}

【讨论】:

  • 您能否解释一下为什么需要使用此解决方案?
  • 因为我找不到任何支持高级加密的库,例如Implicit FTP over TLS ,所以我无法直接在服务器上创建 excel 文件,只能在本地临时创建以复制它并删除它,这几乎与我得到相同结果的方式相同,但我想要的方式会“更好”地在服务器上创建它。这是解决方案。
  • @leit 我知道这一切,但你的回答(不是评论)应该解释你必须使用这个次优的解决方案,只是因为你的服务器的限制 - “基于 TLS 的隐式 FTP” 不是任何“高级加密” - 它实际上是 90 年代遗留下来的 hack,没有现代 FTP 服务器需要使用。
猜你喜欢
  • 2017-06-24
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多