首页 新闻 会员 周边

服务器发布IIS之后,.Net 程序读取不到Excel内容

0
悬赏园豆:100 [已解决问题] 解决于 2016-07-08 08:49

服务器发布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

 

以上方法均没有解决问题,不知道该如何解决。请求高手指点?

< >
分享
最佳答案
0

以前我也遇到这个问题用的Microsoft.office  com组件导入装到服务器上就不行,百度了下说什么office版本不对或没装好,纠结无果改用NPOI搞定,good luck.

收获园豆:100
忧虑的心 | 初学一级 |园豆:73 | 2016-07-07 15:40

第二种方法:用第三方组件: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   
选择大于努力 | 园豆:86 (初学一级) | 2016-07-07 15:48

@选择大于努力: 

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;
    }
}


以前用到的代码,只能帮到这了
View Code
忧虑的心 | 园豆:73 (初学一级) | 2016-07-07 16:05

@清原卡尔: 谢谢,我试下

选择大于努力 | 园豆:86 (初学一级) | 2016-07-07 16:56

@清原卡尔: 昨天通过我的那种NPOI组件没有考虑到Office版本的兼容性,今天才发现你的资料是最全美的了。太谢谢您了

选择大于努力 | 园豆:86 (初学一级) | 2016-07-08 14:45

@选择大于努力: 不谢,请叫我雷锋。

忧虑的心 | 园豆:73 (初学一级) | 2016-07-08 14:54
其他回答(4)
0

也可能是放excel的那个文件夹权限不够,你换成everyone试试

刘宏玺 | 园豆:14020 (专家六级) | 2016-07-07 15:35

我设置的就是everyone权限!

支持(0) 反对(0) 选择大于努力 | 园豆:86 (初学一级) | 2016-07-07 15:43
0

遇到这种问题,我只建议换一种思路,用NPOI(XLS挺好,03版office,07的话比较吃力),EPPLUS(07+推荐用这个)等第三方库搞定。另外,付费Aspose.Cell最好用。

幻天芒 | 园豆:37175 (高人七级) | 2016-07-07 17:18

我现在在尝试NPOI

支持(0) 反对(0) 选择大于努力 | 园豆:86 (初学一级) | 2016-07-07 17:34
0

稿Excel com+ 那是相当的费劲,正确的做法是赶紧换成NPOI

Alvin | 园豆:828 (小虾三级) | 2016-07-07 20:57

我最后就是换成NPOI解决的

支持(0) 反对(0) 选择大于努力 | 园豆:86 (初学一级) | 2016-07-08 08:40
0

听各位大神的宝贵意见,也有同事给的在【Windows2008 R2系统中无法看见Microsoft Excel Application的问题解决方案

http://blog.csdn.net/kongwei521/article/details/43698667】,

最后用NPOI处理好的,http://blog.csdn.net/lybwwp/article/details/20133983 希望遇到过此类的问题,可以参考。

选择大于努力 | 园豆:86 (初学一级) | 2016-07-08 08:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册