如何获取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); } }