服务器发布IIS之后,.Net 程序读取不到Excel内容
具体问题:
本地系统Windows 7 32位,Oracle 32位 Office2010 32位,发布IIS之后可以正常操作。可是发布到客户服务器windows server 2012 r2 64位系统中,装Oracle 64位,Office2010 32位,发布IIS后,浏览Excel文件之后,点击导入,可以把Excel文件保存到服务器的目录下,页面读取不到excel的内容?
如下图:
服务器路径下点击【导入】按钮之后上传的excel 文件:
通过代码弹出客户端脚本错误如下:
网上使用的解决方案:
方法一:
在64位服务器系统上,默认不支持Microsoft.Jet.OLEDB.4.0的驱动程序,系统默认会提示未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”的错误。
<add key="AccessConnection" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=****" />
将红色部分的Microsoft.Jet.OLEDB.4.0改为Microsoft.ACE.OLEDB.12.0,即
<add key="AccessConnection" value="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=****" />
方法二:“设置应用程序池默认属性”/“常规”/”启用32位应用程序”,设置为 true。 如下图所示:
方法三:生成->配置管理器->平台->点击Any Cpu选项卡->新建->新建平台->X86。 如下图所示:
方法四:
1.Microsoft.Jet.OLEDB.4.0不要写成Miscrosoft.Jet.OLEDB.4.0,;
2.Data Source不要写成“Data Sourse”,
3.检查是否安装了Office
4.重新安装注册MDAC28.exe (一般你的vs安装目录里有或者到微软的官方网站上下)
http://www.jb51.net/softs/20587.html
5.如果是64位平台,也可能出现这种情况;解决方法:生成->配置管理器->平台->点击Any Cpu选项卡->新建->新建平台->X86
以上方法均没有解决问题,不知道该如何解决。请求高手指点?
以前我也遇到这个问题用的Microsoft.office com组件导入装到服务器上就不行,百度了下说什么office版本不对或没装好,纠结无果改用NPOI搞定,good luck.
第二种方法:用第三方组件:NPOI组件,推荐使用此方法
先去官网:http://npoi.codeplex.com/下载需要引入dll(可以选择.net2.0或者.net4.0的dll),然后在网站中添加引用。
NPOI 是 POI 项目的 .NET 版本。POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。
使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写。
NPOI采用的是Apache 2.0许可证(poi也是采用这个许可证),这意味着它可以被用于任何商业或非商业项目,你不用担心因为使用它而必须开放你自己的源代码,所以它对于很多从事业务系统开发的公司来说绝对是很不错的选择。
当然作为一个开源许可证,肯定也是有一些义务的,例如如果你在系统中使用NPOI,你必须保留NPOI中的所有声明信息。对于源代码的任何修改,必须做出明确的标识。
01.//config中配置的上传的Excel路径 02. static object basePath = ConfigurationManager.AppSettings["FilePath"]; 03. #region 读取Excel文件 04. /// <summary> 05. /// 读取Excel文件到table中 06. /// </summary> 07. /// <param name="filePath">excel文件路径</param> 08. /// <returns></returns> 09. public static DataTable ReadExcel(string fileName) 10. { 11. DataTable dt = new DataTable(); 12. string filePath = ""; 13. if (basePath != null) 14. { 15. filePath = HostingEnvironment.MapPath((basePath.ToString() + fileName)); 16. dt = ImportExcelFile(filePath); 17. } 18. //文件是否存在 19. if (System.IO.File.Exists(filePath)) 20. { 21. 22. } 23. return dt; 24. } 25. public static DataTable ImportExcelFile(string filePath) 26. { 27. HSSFWorkbook hssfworkbook; 28. #region//初始化信息 29. try 30. { 31. using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read)) 32. { 33. hssfworkbook = new HSSFWorkbook(file); 34. } 35. } 36. catch (Exception e) 37. { 38. throw e; 39. } 40. #endregion 41. 42. NPOI.SS.UserModel.ISheet sheet = hssfworkbook.GetSheetAt(0); 43. System.Collections.IEnumerator rows = sheet.GetRowEnumerator(); 44. DataTable dt = new DataTable(); 45. rows.MoveNext(); 46. HSSFRow row = (HSSFRow)rows.Current; 47. for (int j = 0; j < (sheet.GetRow(0).LastCellNum); j++) 48. { 49. //dt.Columns.Add(Convert.ToChar(((int)'A') + j).ToString()); 50. //将第一列作为列表头 51. dt.Columns.Add(row.GetCell(j).ToString ()); 52. } 53. while (rows.MoveNext()) 54. { 55. row = (HSSFRow)rows.Current; 56. DataRow dr = dt.NewRow(); 57. for (int i = 0; i < row.LastCellNum; i++) 58. { 59. NPOI.SS.UserModel.ICell cell = row.GetCell(i); 60. if (cell == null) 61. { 62. dr[i] = null; 63. } 64. else 65. { 66. dr[i] = cell.ToString(); 67. } 68. } 69. dt.Rows.Add(dr); 70. } 71. return dt; 72. } 73. #endregion
@选择大于努力:
using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; public class ExcelHelper { public class x2003 { #region Excel2003 /// <summary> /// 将Excel文件中的数据读出到DataTable中(xls) /// </summary> /// <param name="file"></param> /// <returns></returns> public static DataTable ExcelToTableForXLS(string file) { DataTable dt = new DataTable(); using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read)) { HSSFWorkbook hssfworkbook = new HSSFWorkbook(fs); ISheet sheet = hssfworkbook.GetSheetAt(0); //表头 IRow header = sheet.GetRow(sheet.FirstRowNum); List<int> columns = new List<int>(); for (int i = 0; i < header.LastCellNum; i++) { object obj = GetValueTypeForXLS(header.GetCell(i) as HSSFCell); if (obj == null || obj.ToString() == string.Empty) { dt.Columns.Add(new DataColumn("Columns" + i.ToString())); //continue; } else dt.Columns.Add(new DataColumn(obj.ToString())); columns.Add(i); } //数据 for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++) { DataRow dr = dt.NewRow(); bool hasValue = false; foreach (int j in columns) { dr[j] = GetValueTypeForXLS(sheet.GetRow(i).GetCell(j) as HSSFCell); if (dr[j] != null && dr[j].ToString() != string.Empty) { hasValue = true; } } if (hasValue) { dt.Rows.Add(dr); } } } return dt; } /// <summary> /// 将DataTable数据导出到Excel文件中(xls) /// </summary> /// <param name="dt"></param> /// <param name="file"></param> public static void TableToExcelForXLS(DataTable dt, string file) { HSSFWorkbook hssfworkbook = new HSSFWorkbook(); ISheet sheet = hssfworkbook.CreateSheet("Test"); //表头 IRow row = sheet.CreateRow(0); for (int i = 0; i < dt.Columns.Count; i++) { ICell cell = row.CreateCell(i); cell.SetCellValue(dt.Columns[i].ColumnName); } //数据 for (int i = 0; i < dt.Rows.Count; i++) { IRow row1 = sheet.CreateRow(i + 1); for (int j = 0; j < dt.Columns.Count; j++) { ICell cell = row1.CreateCell(j); cell.SetCellValue(dt.Rows[i][j].ToString()); } } //转为字节数组 MemoryStream stream = new MemoryStream(); hssfworkbook.Write(stream); var buf = stream.ToArray(); //保存为Excel文件 using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write)) { fs.Write(buf, 0, buf.Length); fs.Flush(); } } /// <summary> /// 获取单元格类型(xls) /// </summary> /// <param name="cell"></param> /// <returns></returns> private static object GetValueTypeForXLS(HSSFCell cell) { if (cell == null) return null; switch (cell.CellType) { case CellType.Blank: //BLANK: return null; case CellType.Boolean: //BOOLEAN: return cell.BooleanCellValue; case CellType.Numeric: //NUMERIC: return cell.NumericCellValue; case CellType.String: //STRING: return cell.StringCellValue; case CellType.Error: //ERROR: return cell.ErrorCellValue; case CellType.Formula: //FORMULA: default: return "=" + cell.CellFormula; } } #endregion } public class x2007 { #region Excel2007 /// <summary> /// 将Excel文件中的数据读出到DataTable中(xlsx) /// </summary> /// <param name="file"></param> /// <returns></returns> public static DataTable ExcelToTableForXLSX(string file) { DataTable dt = new DataTable(); using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read)) { XSSFWorkbook xssfworkbook = new XSSFWorkbook(fs); ISheet sheet = xssfworkbook.GetSheetAt(0); //表头 IRow header = sheet.GetRow(sheet.FirstRowNum); List<int> columns = new List<int>(); for (int i = 0; i < header.LastCellNum; i++) { object obj = GetValueTypeForXLSX(header.GetCell(i) as XSSFCell); if (obj == null || obj.ToString() == string.Empty) { dt.Columns.Add(new DataColumn("Columns" + i.ToString())); //continue; } else dt.Columns.Add(new DataColumn(obj.ToString())); columns.Add(i); } //数据 for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++) { DataRow dr = dt.NewRow(); bool hasValue = false; foreach (int j in columns) { dr[j] = GetValueTypeForXLSX(sheet.GetRow(i).GetCell(j) as XSSFCell); if (dr[j] != null && dr[j].ToString() != string.Empty) { hasValue = true; } } if (hasValue) { dt.Rows.Add(dr); } } } return dt; } /// <summary> /// 将DataTable数据导出到Excel文件中(xlsx) /// </summary> /// <param name="dt"></param> /// <param name="file"></param> public static void TableToExcelForXLSX(DataTable dt, string file) { XSSFWorkbook xssfworkbook = new XSSFWorkbook(); ISheet sheet = xssfworkbook.CreateSheet("Test"); //表头 IRow row = sheet.CreateRow(0); for (int i = 0; i < dt.Columns.Count; i++) { ICell cell = row.CreateCell(i); cell.SetCellValue(dt.Columns[i].ColumnName); } //数据 for (int i = 0; i < dt.Rows.Count; i++) { IRow row1 = sheet.CreateRow(i + 1); for (int j = 0; j < dt.Columns.Count; j++) { ICell cell = row1.CreateCell(j); cell.SetCellValue(dt.Rows[i][j].ToString()); } } //转为字节数组 MemoryStream stream = new MemoryStream(); xssfworkbook.Write(stream); var buf = stream.ToArray(); //保存为Excel文件 using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write)) { fs.Write(buf, 0, buf.Length); fs.Flush(); } } /// <summary> /// 获取单元格类型(xlsx) /// </summary> /// <param name="cell"></param> /// <returns></returns> private static object GetValueTypeForXLSX(XSSFCell cell) { if (cell == null) return null; switch (cell.CellType) { case CellType.Blank: //BLANK: return null; case CellType.Boolean: //BOOLEAN: return cell.BooleanCellValue; case CellType.Numeric: //NUMERIC: return cell.NumericCellValue; case CellType.String: //STRING: return cell.StringCellValue; case CellType.Error: //ERROR: return cell.ErrorCellValue; case CellType.Formula: //FORMULA: default: return "=" + cell.CellFormula; } } #endregion } public static DataTable GetDataTable(string filepath) { var dt = new DataTable("xls"); if (filepath.Last()=='s') { dt = x2003.ExcelToTableForXLS(filepath); } else { dt = x2007.ExcelToTableForXLSX(filepath); } return dt; } } 以前用到的代码,只能帮到这了
@清原卡尔: 谢谢,我试下
@清原卡尔: 昨天通过我的那种NPOI组件没有考虑到Office版本的兼容性,今天才发现你的资料是最全美的了。太谢谢您了
@选择大于努力: 不谢,请叫我雷锋。
也可能是放excel的那个文件夹权限不够,你换成everyone试试
我设置的就是everyone权限!
遇到这种问题,我只建议换一种思路,用NPOI(XLS挺好,03版office,07的话比较吃力),EPPLUS(07+推荐用这个)等第三方库搞定。另外,付费Aspose.Cell最好用。
我现在在尝试NPOI
稿Excel com+ 那是相当的费劲,正确的做法是赶紧换成NPOI
我最后就是换成NPOI解决的
听各位大神的宝贵意见,也有同事给的在【Windows2008 R2系统中无法看见Microsoft Excel Application的问题解决方案
http://blog.csdn.net/kongwei521/article/details/43698667】,
最后用NPOI处理好的,http://blog.csdn.net/lybwwp/article/details/20133983 希望遇到过此类的问题,可以参考。