Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取excel文件中的数据(使用NPOI)_C#_Excel_Email_Npoi - Fatal编程技术网

C# 如何获取excel文件中的数据(使用NPOI)

C# 如何获取excel文件中的数据(使用NPOI),c#,excel,email,npoi,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.App

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

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();
}
这是发送电子邮件的代码:

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);
}

我认为最好的选择是将工作簿对象转换为html。您可以看到转换的预期结果。您可以转换工作簿的内容并将其嵌入电子邮件,如下所示:

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);

    }
}

@安娜·卡罗莱纳·曼赞(Ana Carolina Manzan)非常接近于提供一个有效的解决方案。您必须将Excel工作簿转换为HTML,以便将数据嵌入电子邮件中

我所做的:

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


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

使用:

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();
}
private HSSFWorkbook createWorkbook()
{
HSSFWorkbook=新的HSSFWorkbook();
HSSFSheet sheet1=(HSSFSheet)工作簿。创建工作表(“工作表1”);
HSSFCellStyle1=(HSSFCellStyle)工作簿。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行1=(HSSFRow)表1.创建行(0);
HSSFCell cell1=(HSSFCell)行1.CreateCell(0);
cell1.SetCellValue(“标题1”);
cell1.CellStyle=style1;
HSSFCell cell2=(HSSFCell)行1.CreateCell(1);
cell2.SetCellValue(“标题2”);
cell2.CellStyle=style1;
HSSFCell cell3=(HSSFCell)行1.CreateCell(2);
cell3.SetCellValue(“标题3”);
cell3.CellStyle=style1;
HSSFRow行2=(HSSFRow)表1.创建行(1);
行2.CreateCell(0.SetCellValue(“数据1”);
行2.CreateCell(1.SetCellValue(“数据2”);
行2.CreateCell(2.SetCellValue(“数据3”);
返回工作簿;
}
私有字符串转换ExcelToHTML(HSSF工作簿)
{
ExcelToHtmlConverter ExcelToHtmlConverter=新的ExcelToHtmlConverter();
//设置输出参数
excelToHtmlConverter.OutputColumnHeaders=false;
excelToHtmlConverter.OutputHiddenColumns=false;
excelToHtmlConverter.OutputHiddenRows=true;
excelToHtmlConverter.OutputLeadingSpacessNonBreaking=false;
excelToHtmlConverter.OutputLownNumber=true;
excelToHtmlConverter.UseDivsToSpan=true;
//处理Excel文件
excelToHtmlConverter.ProcessWorkbook(工作簿);
//返回HTML
返回excelToHtmlConverter.Document.InnerXml;
}
私有字符串GetHTML()
{
StringBuilder myBuilder=新建StringBuilder();
AppendLine(“更新列表见附件”);
myBuilder.AppendLine(“”);
myBuilder.AppendLine(“”);
myBuilder.AppendLine(“单元格文本”);
myBuilder.AppendLine(“{excel}”);
myBuilder.AppendLine(“”);
返回myBuilder.ToString();
}

您要做的是使用DataTable对象中的数据创建一个文件?@Ana Carolina Manzan No.我想在电子邮件中嵌入sheet1数据。我已经使用NPOI创建了一个sheet1 xls文件,数据在我的DataTable对象中。您是否已经使用任何代码尝试发送电子邮件?你能给我看看吗?@Ana Carolina Manzan是的,我添加了发送电子邮件的代码!哦,那不是我的问题!该文件是附加在电子邮件中很好,但我也想嵌入在电子邮件正文的部分数据。这就是我创建函数getHtml()的原因。我成功地嵌入了dataTable数据,但我无法将sheet1数据嵌入到电子邮件正文中。
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();
}