1 /// <summary>
2 /// 导出Excel可带图片
3 /// </summary>
4 /// <param name="tmpDataTable">需要导出的Table</param>
5 /// <param name="strFileName">Excel保存的路径带文件名</param>
6 /// <param name="imgColumnName">图片列名[没图片为""即可]</param>
7 /// <param name="imgWidth">图片宽</param>
8 /// <param name="imgHeight">图片高</param>
9 /// <param name="isByte">是否是二进字符串</param>
10 public void ImportExcel(System.Data.DataTable tmpDataTable, string strFileName, string imgColumnName, int imgWidth, int imgHeight, bool isByte)
11 {
12 if (tmpDataTable == null)
13 {
14 return;
15 }
16 Microsoft.Office.Interop.Excel.Application m_xlApp = null;
17 Microsoft.Office.Interop.Excel.Workbooks workbooks = null;
18 Microsoft.Office.Interop.Excel.Workbook workbook = null;
19 Microsoft.Office.Interop.Excel.Worksheet worksheet = null;
20 Microsoft.Office.Interop.Excel.Range m_range = null;
21 try
22 {
23 long rowNum = tmpDataTable.Rows.Count;//行数
24 int columnNum = tmpDataTable.Columns.Count;//列数
25 m_xlApp = new Microsoft.Office.Interop.Excel.Application();
26 m_xlApp.DisplayAlerts = false;//不显示更改提示
27 m_xlApp.Visible = false;
28 if (m_xlApp.Version == "11.0")
29 {
30 strFileName = strFileName.Substring(0, strFileName.Length - 1); //如果是2003版.则把后缀名修改一下.xlsx 修改为 xls
31 }
32
33 workbooks = m_xlApp.Workbooks;
34 workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
35 worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得sheet1
36
37
38 for (int i = 0; i < columnNum; i++) //写入字段
39 {
40 Microsoft.Office.Interop.Excel.Range range = (Microsoft.Office.Interop.Excel.Range)worksheet.Rows[1];
41 range.Columns[i + 1] = tmpDataTable.Columns[i].Caption;
42 }
43 int r = 0;
44 for (r = 0; r < rowNum; r++)
45 {
46 for (int i = 0; i < columnNum; i++)
47 {
48 //行的共同属性
49 m_range = (Microsoft.Office.Interop.Excel.Range)worksheet.Rows[r + 2];
50 m_range.RowHeight = imgHeight + 14; //设置行高 +14 避免图片紧贴着单元格边线
51 if (tmpDataTable.Columns[i].ColumnName == imgColumnName)
52 {
53 #region 图片列的共同设置
54 string strTemp = "";
55 for (int j = 0; j < (imgWidth / 7) + 2; j++)
56 {
57 strTemp += " ";
58 }
59 m_range.Columns[i + 1] = strTemp; //添加空格,用于自动适应格式.免得图片位置不正确.
60 Microsoft.Office.Interop.Excel.Range mCol = (Microsoft.Office.Interop.Excel.Range)m_range.Columns[i + 1];
61 float topCount = Convert.ToSingle((int)mCol.Top + 7);
62 float leftCount = Convert.ToSingle((int)mCol.Left + 7);
63 #endregion
64 if (isByte)
65 {
66 #region 保存图片并添加到excel---图片二进制字符串[请使用Convert.FromBase64String转换]
67 Byte[] imgbyte = Convert.FromBase64String(tmpDataTable.Rows[r][i].ToString());
68 MemoryStream my = new MemoryStream(imgbyte);
69 Image img = Image.FromStream(my);
70 string fileNameTemp = ""; //图片暂时路径.
71 try
72 {
73 string parentPath = System.Windows.Forms.Application.StartupPath;
74 string hzm = "jpg"; //默认jpg
75 #region 获取后缀名
76 //获取后缀名
77 if (img.RawFormat.Guid == ImageFormat.Gif.Guid)
78 {
79 hzm = ImageFormat.Gif.ToString();
80 }
81 if (img.RawFormat.Guid == ImageFormat.Png.Guid)
82 {
83 hzm = ImageFormat.Png.ToString();
84 }
85 if (img.RawFormat.Guid == ImageFormat.Bmp.Guid)
86 {
87 hzm = ImageFormat.Bmp.ToString();
88 }
89 #endregion
90 fileNameTemp = parentPath + "\\" + Guid.NewGuid().ToString() + "." + hzm;
91 img.Save(fileNameTemp);
92 worksheet.Shapes.AddPicture(fileNameTemp, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoTrue, Convert.ToSingle(leftCount), Convert.ToSingle(topCount), imgWidth, imgHeight);
93 }
94 catch (Exception e)
95 {
96 //throw e;
97 // 单个图片未添加成功.不作处理
98
99 }
100 finally
101 {
102 File.Delete(fileNameTemp); //有没有成功都删除临时图片.
103 }
104 #endregion
105 }
106 else
107 {
108 #region 本地图片和网络图片
109 string tmpPath = tmpDataTable.Rows[r][i].ToString();
110 bool IsHttp = false;
111 try
112 {
113
114 if (tmpDataTable.Rows[r][i].ToString().IndexOf("http://") >= 0)
115 {
116 string url = tmpDataTable.Rows[r][i].ToString();
117 string parentPath = System.Windows.Forms.Application.StartupPath;
118 string hzm = url.Substring(url.LastIndexOf('.') + 1, 3);
119
120 WebClient web = new WebClient();
121 tmpPath = parentPath + "\\" + Guid.NewGuid().ToString() + "." + hzm;
122
123 #region 如果下载失败.循环2次下载图片
124 bool isp = true;
125 int a = 0;
126 while (isp && a < 2)
127 {
128 try
129 {
130 web.DownloadFile(url, tmpPath);
131 IsHttp = true;
132 isp = false;
133 }
134 catch (Exception e)
135 {
136 isp = true;
137 a++;
138 if (a > 2)
139 {
140 throw e;
141 }
142 }
143 System.Threading.Thread.Sleep(1000);
144 }
145
146 #endregion
147 }
148
149
150 worksheet.Shapes.AddPicture(tmpPath, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoTrue, Convert.ToSingle(leftCount), Convert.ToSingle(topCount), imgWidth, imgHeight);
151 }
152 catch (Exception e)
153 {
154 // 单个图片未添加成功.不作处理
155 }
156 finally
157 {
158 if (IsHttp)
159 {
160 File.Delete(tmpPath);
161 }
162 }
163 #endregion
164 }
165 }
166 else
167 {
168 object obj = tmpDataTable.Rows[r][tmpDataTable.Columns[i].ToString()];
169 m_range.RowHeight = imgHeight + 14; // +14 避免图片紧贴着单元格边线
170 m_range.Columns[i + 1] = obj == null ? "" : obj.ToString().Trim();
171 }
172 }
173 }
174 worksheet.Columns.EntireColumn.AutoFit();//列宽自适应。
175 m_xlApp.WindowState = Microsoft.Office.Interop.Excel.XlWindowState.xlMaximized;
176 workbook.Saved = true;
177 workbook.SaveCopyAs(strFileName);
178 }
179 catch (Exception e)
180 {
181 throw e;
182 }
183 finally
184 {
185 #region 保存完成,释放资源.
186 ReleaseObj(worksheet);
187 ReleaseObj(workbook);
188 ReleaseObj(workbooks);
189 ReleaseObj(m_xlApp);
190 System.GC.Collect();
191 System.GC.WaitForPendingFinalizers();
192 #endregion
193 }
194 }
195 /// <summary>
196 /// 释放对象,内部调用
197 /// </summary>
198 /// <param name="o"></param>
199 private void ReleaseObj(object o)
200 {
201 try
202 {
203 System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
204 }
205 catch { }
206 finally { o = null; }
207 }