如何在excel文件中获取数据(使用NPOI)

时间:2017-06-27 17:41:54

标签: c# excel email npoi

我发送此功能是为了在发送电子邮件时嵌入数据。所以我可以在电子邮件正文中调用此函数。

private static string getHTML(DataTable dt)
{
    StringBuilder myBuilder = new StringBuilder();

    myBuilder.AppendLine("see attached for the updated list.");
    myBuilder.AppendLine("");

    myBuilder.Append("<table border='1px' cellpadding='5' cellspacing='0' ");
    myBuilder.Append("style='border: solid 1px Silver; font-size: x-small;'>");

    myBuilder.Append("<tr align='left' valign='top'>");


    foreach (DataColumn myColumn in dt.Columns)
    {
        myBuilder.Append("<td align='left' valign='top'>");
        myBuilder.Append(myColumn.ColumnName);
        myBuilder.Append("</td>");
    }

    myBuilder.Append("</tr>");

    int a = 1;

    foreach (DataRow myRow in dt.Rows)
    {
        myBuilder.Append("<tr align='left' valign='top'>");

        foreach (DataColumn myColumn in dt.Columns)
        {
            myBuilder.Append("<td align='left' valign='top'>");
            myBuilder.Append(myRow[myColumn.ColumnName].ToString());
            myBuilder.Append("</td>");
        }

        myBuilder.Append("</tr>");
        a++;

        if (a > 4)
            break;
    }

    myBuilder.Append("</table>");

    return myBuilder.ToString();
}

但是当我尝试嵌入使用NPOI库(而不是Datatable)制作的excel文件时,我找不到合适的函数或任何东西来获取文件中的数据。

如何将sheet1数据嵌入电子邮件中?

这是我创建工作表的代码:

private void Email()
{
    //get the data from database
    DataTable data = GetData();
    IWorkbook workbook;
    workbook = new HSSFWorkbook();

    ISheet sheet1 = workbook.CreateSheet("Sheet 1");

    // [...]
}

这是发送电子邮件的代码:

private void email()
{
    // [...]        

    using (var ms = new MemoryStream())
    {
        workbook.Write(ms);
        ms.Position = 0;

        using (MailMessage mm = new MailMessage())
        {
            mm.From = new MailAddress("abcd@gmail.com");
            mm.Bcc.Add("abcd@gmail.com");

            SmtpClient smtp = new SmtpClient();
            mm.Subject = "Task List";

            StringBuilder sb = new StringBuilder();
            mm.Body = getHTML(data);
            mm.Attachments.Add(new Attachment(ms, "Task.xls", "application/vnd.ms-excel"));
            mm.IsBodyHtml = true;
            smtp.Host = "smtp.gmail.com";
            smtp.EnableSsl = true;
            System.Net.NetworkCredential credentials = new System.Net.NetworkCredential();
            credentials.UserName = "abc@gmail.com";
            credentials.Password = "1234";
            smtp.UseDefaultCredentials = true;
            smtp.Credentials = credentials;
            smtp.Port = 587;
            smtp.Send(mm);
        }
    }
}

workbook.RemoveSheetAt(0);
}

2 个答案:

答案 0 :(得分:2)

@Ana Carolina Manzan非常接近提供有效的解决方案。您必须将Excel工作簿转换为HTML才能将数据嵌入电子邮件中。

我做了什么:

  • 创建包含一些数据和样式的工作簿:CreateWorkbook
  • 将工作簿转换为HTML:ConvertExcelToHTML
  • 获取带有标记{excel}的HTML表格,以在特定位置显示嵌入式工作簿:GetHTML
  • 使用HTML工作簿发送替换{excel}的邮件。

<强>参考文献:

请尝试以下工作代码(已测试):

Usings:

using NPOI.HSSF.UserModel;
using NPOI.SS.Converter;
using System.IO;
using System.Net;
using System.Net.Mail;

主要代码:

HSSFWorkbook workbook = CreateWorkbook();

string excelEmbedded = string.Empty;

using (MemoryStream ms = new MemoryStream())
{
    workbook.Write(ms);
    ms.Position = 0;

    excelEmbedded = ConvertExcelToHTML(workbook);
}

using (MailMessage message = new MailMessage())
{
    message.Body = GetHTML().Replace("{excel}", excelEmbedded);
    message.Subject = "Embedded Excel";
    message.From = new MailAddress("abcd@gmail.com");
    message.To.Add("abc@gmail.com");
    message.IsBodyHtml = true;

    using (SmtpClient client = new SmtpClient())
    {
        NetworkCredential credentials = new NetworkCredential();
        credentials.UserName = "abc@gmail.com";
        credentials.Password = "1234";

        client.Host = "smtp.gmail.com";
        client.UseDefaultCredentials = true;
        client.Credentials = credentials;
        client.Port = 587;

        client.Send(message);
    }
}

方法

private HSSFWorkbook createWorkbook()
{
    HSSFWorkbook workbook = new HSSFWorkbook();

    HSSFSheet sheet1 = (HSSFSheet)workbook.CreateSheet("Sheet 1");

    HSSFCellStyle style1 = (HSSFCellStyle)workbook.CreateCellStyle();
    style1.BorderLeft = NPOI.SS.UserModel.BorderStyle.Medium;
    style1.BorderRight = NPOI.SS.UserModel.BorderStyle.Medium;
    style1.BorderTop = NPOI.SS.UserModel.BorderStyle.Medium;
    style1.BorderBottom = NPOI.SS.UserModel.BorderStyle.Medium;

    HSSFRow row1 = (HSSFRow)sheet1.CreateRow(0);

    HSSFCell cell1 = (HSSFCell)row1.CreateCell(0);
    cell1.SetCellValue("Header 1");
    cell1.CellStyle = style1;

    HSSFCell cell2 = (HSSFCell)row1.CreateCell(1);
    cell2.SetCellValue("Header 2");
    cell2.CellStyle = style1;

    HSSFCell cell3 = (HSSFCell)row1.CreateCell(2);
    cell3.SetCellValue("Header 3");
    cell3.CellStyle = style1;

    HSSFRow row2 = (HSSFRow)sheet1.CreateRow(1);
    row2.CreateCell(0).SetCellValue("Data 1");
    row2.CreateCell(1).SetCellValue("Data 2");
    row2.CreateCell(2).SetCellValue("Data 3");

    return workbook;
}

private string ConvertExcelToHTML(HSSFWorkbook workbook)
{
    ExcelToHtmlConverter excelToHtmlConverter = new ExcelToHtmlConverter();

    // Set output parameter
    excelToHtmlConverter.OutputColumnHeaders = false;
    excelToHtmlConverter.OutputHiddenColumns = false;
    excelToHtmlConverter.OutputHiddenRows = true;
    excelToHtmlConverter.OutputLeadingSpacesAsNonBreaking = false;
    excelToHtmlConverter.OutputRowNumbers = true;
    excelToHtmlConverter.UseDivsToSpan = true;

    // Process the Excel file
    excelToHtmlConverter.ProcessWorkbook(workbook);

    // Return the HTML
    return excelToHtmlConverter.Document.InnerXml;
}

private string GetHTML()
{
    StringBuilder myBuilder = new StringBuilder();

    myBuilder.AppendLine("see attached for the updated list.");
    myBuilder.AppendLine("");

    myBuilder.AppendLine("<table style='border:1px solid black'>");
    myBuilder.AppendLine("<tr><td>Cell Text</td></tr>");
    myBuilder.AppendLine("<tr><td>{excel}</td></tr>");
    myBuilder.AppendLine("</table>");

    return myBuilder.ToString();
}

答案 1 :(得分:1)

我认为您最好的选择是将WorkBook对象转换为html。您可以看到转化期望的结果in this article。您可以转换WorkBook的内容并将其嵌入到电子邮件中,如下所示:

private string ConvertXlsToHtml(IWorkbook workbook)
{
    ExcelToHtmlConverter excelToHtmlConverter = new ExcelToHtmlConverter();

    // Set output parameters 
    excelToHtmlConverter.OutputColumnHeaders = false;
    excelToHtmlConverter.OutputHiddenColumns = true;
    excelToHtmlConverter.OutputHiddenRows = true;
    excelToHtmlConverter.OutputLeadingSpacesAsNonBreaking = false;
    excelToHtmlConverter.OutputRowNumbers = true;
    excelToHtmlConverter.UseDivsToSpan = true;

    // Process the Excel file 
    excelToHtmlConverter.ProcessWorkbook(workbook);

    return excelToHtmlConverter.Document.ToString();
}

....

using (var ms = new MemoryStream())
{
    workbook.Write(ms);
    ms.Position = 0;

    string mailBody = getHTML(data) + ConvertXlsToHtml(workbook);

    using (MailMessage mm = new MailMessage())
    {
        mm.From = new MailAddress("abcd@gmail.com");

        mm.Bcc.Add("abcd@gmail.com");

        SmtpClient smtp = new SmtpClient();
        mm.Subject = "Task List";

        StringBuilder sb = new StringBuilder();
        mm.Body = mailBody;
        mm.Attachments.Add(new Attachment(ms, "Task.xls", "application/vnd.ms-excel"));
        mm.IsBodyHtml = true;
        smtp.Host = "smtp.gmail.com";
        smtp.EnableSsl = true;
        System.Net.NetworkCredential credentials = new System.Net.NetworkCredential();
        credentials.UserName = "abc@gmail.com";
        credentials.Password = "1234";
        smtp.UseDefaultCredentials = true;
        smtp.Credentials = credentials;
        smtp.Port = 587;
        smtp.Send(mm);

    }
}