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
- 获取一个带有标记
的HTML表,以在特定位置显示嵌入的工作簿:{excel}
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();
}