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

我发这个函数来发送邮件时embedded数据。 所以我可以在电子邮件的正文中调用这个函数。

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

但是当我尝试embedded使用NPOI库(而不是Datatable)制作的excel文件时,我无法find合适的函数或任何获取文件中的数据。

如何将sheet1数据embedded到电子邮件中?

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

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

@Ana Carolina Manzan非常接近提供一个工作解决scheme。 您必须将Excel工作簿转换为HTML才能将数据embedded到电子邮件中。

我做了什么:

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

参考文献:

  • NPOI将Excel转换为HTML样本
  • NPOI HSSF样品

请尝试下面的工作代码(testing):

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

我认为你最好的select是将你的WorkBook对象转换为html。 您可以在本文中看到转换的结果。 您可以转换WorkBook的内容并将其embedded到电子邮件中,如下所示:

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