4

クライアントから、Excelスプレッドシートを含むメールを送信するために、アプリの1つを拡張するように依頼されました。たまたまSpreadsheetGear(2009)の古いコピーが転がっていたので、それを使えば時間を節約できるのではないかと思いました。

たまたま、SpreadsheetGearは実際にスプレッドシートを作成するのに最適でしたが、電子メールの添付ファイルとして送信するのに問題があります。誰かがこれをしたのだろうか?理論的にはかなり簡単なはずです。私の現在のコードは次のとおりです。

    /// <summary>
    /// Creates an email attachment based upon the inbound workbook
    /// </summary>
    /// <param name="workbook">The workbook</param>
    /// <returns>an email Attachment</returns>
    private static Attachment CreateAttachment(string id, IWorkbook workbook)
    {
        // Open up a memorystream and save out to it
        System.IO.MemoryStream memoryStream = new System.IO.MemoryStream();
        workbook.SaveToStream(memoryStream, SpreadsheetGear.FileFormat.OpenXMLWorkbook);

        return new Attachment(memoryStream, id + ".xls", "application/vnd.ms-excel");
    }

ここで、ワークブックは完全に入力されたSpreadsheetGearワークブックです。System.Net.Mail.MailMessageこの後、Attachmentオブジェクトはを使用してオブジェクトにプッシュされます

MailMessage.Attachments.Add(attachment);

私が見ているのは:

  • メールは正常に送信され、正しい名前が添付されています
  • ただし、添付ファイルは空です

開発環境では、いくつかのデバッグコードを行に沿って配置します

workbook.SaveAs("c:\\test.xls", SpreadsheetGear.FileFormat.OpenXMLWorkbook);

これにより、目的のスプレッドシートがファイルとして生成されました。しかし、明らかに私はこれを最終的に電子的に送信しているだけなので、可能であれば、ディスクへの書き込みはまったく避けたいと思います。私がどこを間違えたのかについての指針はありますか?

ありがとう、ピート

(最後に、最新のSpreadsheetGearへのアップグレードはオプションではなく、このアプローチまたは手動で行うことを追加する必要があります!環境はVS2008、.net 3.5です)

4

2 に答える 2

4

私はあなたの質問のコードを使ってみました。それは2つの小さな変更で私のために働いた。

1)OpenXMLWorkbook形式で保存しているため、拡張子を.xlsではなく.xlsxに変更しました。

2)workbook.SaveToStreamメソッドを保存した後、次のコード行を追加しました。

memoryStream.Seek(0, System.IO.SeekOrigin.Begin);

これにより、位置がストリームの先頭に設定されます。それなしでコードを試したところ、Excelの添付ファイルを開こうとするとエラーが発生しました。

これらの変更を行わないと、エラーが発生しましたが、空の添付ファイルを取得することはありませんでした。私は最新バージョンのSSGを使用していますが、この場合にそれが重要である理由がわかりません。

于 2012-11-19T21:40:16.673 に答える
0

ステップ1

ClosedXML dllをダウンロードし、プロジェクトへの参照を追加します

ステップ2。DocumentFormat.OpenXMLをダウンロードし、プロジェクトへの参照を追加します

System.IOを使用します。

ClosedXML.Excelを使用します。

public void send mail(){

DataTable dt = smp.GetDataTable( "select l.EMPID as [EmpID]、e.Emp_Name as [EmpName]、l.LDate as [ApplicationDate]、l.StartDate as [FromDate]、l.EndDate as [ToDate] from LeaveTable ");

XLWorkbook wb = new XLWorkbook();

var ws = wb.Worksheets.Add(dt、sheetName);

System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(); wb.SaveAs(memoryStream);

memoryStream.Seek(0、System.IO.SeekOrigin.Begin);

System.Net.Mail.Attachment attachment = new System.Net.Mail.Attachment(memoryStream、sheetName + ".xlsx"、 "application / vnd.ms-excel");

SendEmail(To、To1、Subject、Body、attachment);

}

public static bool SendEmail(string pTo、string pTo1、string pSubject、string pBody、System.Net.Mail.Attachment attachment){

            MailMessage myMail = new MailMessage();

         ConfigurationSettings.AppSettings["emailid"].ToString();


            SmtpSection settings =(SmtpSection) ConfigurationManager.GetSection("system.net/mailSettings/smtp");
            var email = settings.Network.UserName;

            bool ssl = Convert.ToBoolean(ConfigurationManager.AppSettings["ssl"].ToString());

            myMail.From = new MailAddress(email);
            myMail.To.Add(pTo);
            if (pTo1 != "")
            {
                myMail.CC.Add(pTo1);
            }
            myMail.Subject = pSubject;
            myMail.Body = pBody;
            myMail.Priority = MailPriority.High;
            myMail.Attachments.Add(attachment);


            SmtpClient client = new SmtpClient();
            client.EnableSsl = ssl;


            client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
            client.Send(myMail);
            LogMessage.LogMsg = "Mailsent to:" + pTo + myMail.Body;
            LogMessage.CreateLogFile();

            return true;

        }
于 2015-09-03T11:41:26.750 に答える