导出含有图片的EXCEL的解决办法
导出EXCEL的是我们程序中常有的操作,而平时操作的都是只有文本数据的EXCEL,很少会导出图片到EXCEL中。导出图片到EXCEL,可以利用EXCEL.DLL操作EXCEL,然而,如果服务器上要求不安装OFFICE的话,这个时候就很难处理(有时候确实有这样的需求,服务器上不让装OFFICE)。经过考虑,我用了一种较为另类的解决办法:
1、把数据写成一个HTML的表格形式到一个txt文本文件中。
2、表格显示图片的单元格中存储图片的路径。
3、新建一个文件夹存放路径
4、强制性更改文本文件为XLS后缀。
这样到处的文件将有一个图片文件夹+一个EXCLE文件。
Code
int ICardInfoService.ExportDataToExcelFile(string filePath, DateTime beginTime, DateTime endTime)
{
try
{
DataSet ds = dao.GetDataToExcel(beginTime, endTime);//得到要到处的数据,最后一列存储的是图片路径
StringBuilder sb = new StringBuilder();
//StreamWriter streamw = File.CreateText(filePath);
StreamWriter streamw = new StreamWriter(filePath, false, System.Text.Encoding.GetEncoding("GB2312"));//解决乱码问题
sb.Append("<table style=\"border: 1px solid #000000;\">");
if (ds != null)
{
for (int m = 0; m < ds.Tables[0].Columns.Count; m++)
{
sb.Append("<th style=\"border: 1px solid #000000;\">");
sb.Append(ds.Tables[0].Columns[m].ColumnName);
sb.Append("</th>");
}//循环写标题
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
sb.Append("<tr style=\"height:160px;\">");
for (int j = 0; j < ds.Tables[0].Columns.Count; j++)
{
if (j != ds.Tables[0].Columns.Count-1)
{
sb.Append("<td style=\"border: 1px solid #000000;\">");
sb.Append(ds.Tables[0].Rows[i][j].ToString());
sb.Append("</td>");
}
else
{
sb.Append("<td style=\"border: 1px solid #000000;width:250px\">");
string newPhotoFile = Environment.CurrentDirectory + "\\ExportFile";
string photoPath=Environment.CurrentDirectory+"\\"+ds.Tables[0].Rows[i][j].ToString();
File.Copy(photoPath, newPhotoFile + "\\" + ds.Tables[0].Rows[i][j].ToString(),true);
sb.Append("<img ");
sb.Append("src=\"");
sb.Append(ds.Tables[0].Rows[i][j].ToString());
sb.Append("\"/>");
sb.Append("</td>");
}//最后一列显示图片,单独处理
}
sb.Append("</tr>");
}//循环写数据
streamw.Write(sb.ToString());
streamw.Close();
string newpath= Path.ChangeExtension(filePath, ".xls");//强制性更改文件名
File.Move(filePath, newpath);
return 1;
}
return -1;
}
catch (Exception e)
{
LogUtil.Error(e);
return -1;
}
}
int ICardInfoService.ExportDataToExcelFile(string filePath, DateTime beginTime, DateTime endTime)
{
try
{
DataSet ds = dao.GetDataToExcel(beginTime, endTime);//得到要到处的数据,最后一列存储的是图片路径
StringBuilder sb = new StringBuilder();
//StreamWriter streamw = File.CreateText(filePath);
StreamWriter streamw = new StreamWriter(filePath, false, System.Text.Encoding.GetEncoding("GB2312"));//解决乱码问题
sb.Append("<table style=\"border: 1px solid #000000;\">");
if (ds != null)
{
for (int m = 0; m < ds.Tables[0].Columns.Count; m++)
{
sb.Append("<th style=\"border: 1px solid #000000;\">");
sb.Append(ds.Tables[0].Columns[m].ColumnName);
sb.Append("</th>");
}//循环写标题
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
sb.Append("<tr style=\"height:160px;\">");
for (int j = 0; j < ds.Tables[0].Columns.Count; j++)
{
if (j != ds.Tables[0].Columns.Count-1)
{
sb.Append("<td style=\"border: 1px solid #000000;\">");
sb.Append(ds.Tables[0].Rows[i][j].ToString());
sb.Append("</td>");
}
else
{
sb.Append("<td style=\"border: 1px solid #000000;width:250px\">");
string newPhotoFile = Environment.CurrentDirectory + "\\ExportFile";
string photoPath=Environment.CurrentDirectory+"\\"+ds.Tables[0].Rows[i][j].ToString();
File.Copy(photoPath, newPhotoFile + "\\" + ds.Tables[0].Rows[i][j].ToString(),true);
sb.Append("<img ");
sb.Append("src=\"");
sb.Append(ds.Tables[0].Rows[i][j].ToString());
sb.Append("\"/>");
sb.Append("</td>");
}//最后一列显示图片,单独处理
}
sb.Append("</tr>");
}//循环写数据
streamw.Write(sb.ToString());
streamw.Close();
string newpath= Path.ChangeExtension(filePath, ".xls");//强制性更改文件名
File.Move(filePath, newpath);
return 1;
}
return -1;
}
catch (Exception e)
{
LogUtil.Error(e);
return -1;
}
}
调用方法:
Code
string newPhotoFile = Environment.CurrentDirectory + "\\ExportFile";
Directory.CreateDirectory(newPhotoFile + "\\photos");//新建导出目录
string tempFile = newPhotoFile + "\\temp.txt";//先新建一个文本文件存储HTML
if (File.Exists(tempFile))
{
File.Delete(tempFile);
}
int result = this.service.ExportDataToExcelFile(tempFile, beginTime, endtime);
if (result == -1)
{
return result;
}
string newPhotoFile = Environment.CurrentDirectory + "\\ExportFile";
Directory.CreateDirectory(newPhotoFile + "\\photos");//新建导出目录
string tempFile = newPhotoFile + "\\temp.txt";//先新建一个文本文件存储HTML
if (File.Exists(tempFile))
{
File.Delete(tempFile);
}
int result = this.service.ExportDataToExcelFile(tempFile, beginTime, endtime);
if (result == -1)
{
return result;
}
客户下载的时候,需要下载整个文件目录,该目录中包括了图片文件夹和一个EXCEL文件。
没啥技术含量,但却是个不错的思路,不知道放首页上是否合适,呵呵,希望大家不要拍砖:)