找回密码
 立即注册

QQ登录

只需一步,快速开始

刘洋

注册会员

8

主题

16

帖子

166

积分

注册会员

积分
166
刘洋
注册会员   /  发表于:2023-2-19 19:17  /   查看:2120  /  回复:11
50金币
本帖最后由 刘洋 于 2023-2-20 01:49 编辑

我写了一个webAPI。
功能涉及到对excel文件的操作
代码中的地址用的是绝对地址c:\xxx\xx.xlsx


发布之前本地调试没问题。发布之后,调用API失败。


猜想一定是路径的问题(服务器的物理路径下已经放置了excel文件)。
问题就是:涉及到本地文件引用的API。路径应该怎么写。试过了url路径和本地路径,都不行。
附上c#代码和工程文件,跪求解决方案
  1. using System.Collections.Generic;
  2. using Excel = Microsoft.Office.Interop.Excel;
  3. using GrapeCity.Forguncy.ServerApi;
  4. using System.Diagnostics;
  5. using System;

  6. namespace excelforhzgpost
  7. {
  8.     public class Class1 : ForguncyApi
  9.     {
  10.         [Post]
  11.         public void excelforhzg()
  12.         {
  13.             var from = Context.Request.ReadFormAsync().Result;
  14.             var path = from["path"][0];
  15.             Excel.Application myApp = new Excel.Application();
  16.             object missing = System.Reflection.Missing.Value;//设置object的默认值,需要添加名称空间using System.Reflection;
  17.             //string path = @"http://127.0.0.1/xx/upload/priceList.xlsx";
  18.             Excel.Workbook wb = myApp.Workbooks.Open(Convert.ToString(path));
  19.             int sheetCount = wb.Worksheets.Count;//sheet数量
  20.             for (int i = 1; i <= sheetCount; i++)
  21.             {
  22.                 Excel.Worksheet ws = wb.Worksheets[i];
  23.                 string pinzhong = ws.Name;
  24.                 //int rows = ws.Rows.Count;//总行数
  25.                 //int cols = ws.Columns.Count;//总列数
  26.                 int rows = ws.UsedRange.CurrentRegion.Rows.Count;//总行数
  27.                 int cols = ws.UsedRange.CurrentRegion.Columns.Count;//总列数;
  28.                 for (int r = 3; r <= rows; r++)
  29.                 {
  30.                     string changdustr = Convert.ToString(ws.Rows[r].Cells[1].Value);//长度str                    
  31.                     for (int c = 2; c <= cols; c++)
  32.                     {
  33.                         string jg = Convert.ToString(ws.Rows[r].Cells[c].Value);//判断非空str

  34.                         string zhijingstr = ws.Rows[2].Cells[c].Value;//直径字符串                                                   

  35.                         if (changdustr != null && zhijingstr != null && jg != null)
  36.                         {
  37.                             int zhijing = int.Parse(System.Text.RegularExpressions.Regex.Replace(zhijingstr, @"[^0-9]+", ""));//直径int
  38.                             double changdu = double.Parse(changdustr);
  39.                             double jiage = double.Parse(jg);//价格
  40.                             this.DataAccess.AddTableData("产品价格表", new Dictionary<string, object>
  41.                             {
  42.                                 {"产品编号", pinzhong },
  43.                                 {"长度",changdu },
  44.                                 {"直径",zhijing },
  45.                                 {"标准价",jiage }
  46.                             });
  47.                         }
  48.                     }
  49.                 }
  50.             }
  51.             myApp.Quit();
  52.             System.Runtime.InteropServices.Marshal.ReleaseComObject(myApp);
  53.             myApp = null;
  54.             //创建进程对象
  55.             Process[] ExcelProcess = Process.GetProcessesByName("Excel");
  56.             //关闭进程
  57.             foreach (Process p in ExcelProcess)
  58.             { p.Kill(); }
  59.         }
  60.     }
  61. }
复制代码


附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册

最佳答案

查看完整内容

问题解决了。但是不知道为什么。说一下我解决问题的过程吧。 首先通过8楼版主大大的指点,思路聚焦到代码调试上。可是又不知道发布版应该附加哪个进程,就在冥思苦想中,发现了这个信息。 所有用户进程中会发现几个同名的system进程,无疑这就是发布版使用的进程了。附加之后调试果然运行了代码。 终于可以找到问题了。于是…… 接下来又是一阵沉思和无尽的百度。 因为路径绝对的没问题,先后思考过文件是否被进程 ...

11 个回复

倒序浏览
最佳答案
最佳答案
刘洋
注册会员   /  发表于:2023-2-19 19:17:48
来自 10#
本帖最后由 刘洋 于 2023-2-20 23:05 编辑

问题解决了。但是不知道为什么。说一下我解决问题的过程吧。

首先通过8楼版主大大的指点,思路聚焦到代码调试上。可是又不知道发布版应该附加哪个进程,就在冥思苦想中,发现了这个信息。

所有用户进程中会发现几个同名的system进程,无疑这就是发布版使用的进程了。附加之后调试果然运行了代码。

终于可以找到问题了。于是……

接下来又是一阵沉思和无尽的百度。

因为路径绝对的没问题,先后思考过文件是否被进程占用、文件夹权限、和System.Runtime.InteropServices.COMException相关模块是否加载成功等等方面的问题。

从“System.Runtime.InteropServices.COMException”百度到“Microsoft Excel 不能访问文件”。

终于在一个不知名的角落,找到这篇文章。https://wenku.baidu.com/view/fc126b7bccc789eb172ded630b1c59eef8c79a35.html

对于这个方法,我完全无法理解。但还是抱着试试看的心态,尝试了一下,果然解决了问题。

一定是无知让我莫名其妙。
最后还是希望有大神给讲讲其中的道理。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

评分

参与人数 1金币 +66 收起 理由
David.Zhong + 66 勤劳的格友大佬,赞~恭喜解决问题~也是我知.

查看全部评分

回复 使用道具 举报
renho活字格认证
银牌会员   /  发表于:2023-2-19 20:45:22
2#
把地址整成参数,动态传进去
回复 使用道具 举报
刘洋
注册会员   /  发表于:2023-2-20 00:43:35
3#
renho 发表于 2023-2-19 20:45
把地址整成参数,动态传进去

试过了。还是不行啊。一样是本地调试可以,发布就不行了。本地发布也不行。不过还是谢谢你
回复 使用道具 举报
Joe.xu讲师达人认证 悬赏达人认证 活字格认证
超级版主   /  发表于:2023-2-20 09:49:09
4#
汗颜,代码是真的不太懂,看看有没有大神能施以援手的~
回复 使用道具 举报
刘洋
注册会员   /  发表于:2023-2-20 10:17:49
5#
或者是不是活字格本地调试的服务和发布后的服务环境不一样啊。有些依赖dll找不到呢?有没有人给讲讲,本体调试用的是什么服务
回复 使用道具 举报
Joe.xu讲师达人认证 悬赏达人认证 活字格认证
超级版主   /  发表于:2023-2-20 11:24:29
6#
要么填一下我们这边的1V1申请:https://www.grapecity.com.cn/applyonline
通过申请后会有专门代码技术联系您,给您提供一个月免费的快速支持通道
回复 使用道具 举报
renho活字格认证
银牌会员   /  发表于:2023-2-20 12:06:16
7#
那不可能,应该就是你插件开发的问题了
回复 使用道具 举报
David.Zhong讲师达人认证 悬赏达人认证 活字格认证
论坛元老   /  发表于:2023-2-20 13:51:46
8#
大佬,发布到本地调试一下,看看具体是哪报错了,报错的信息是啥。
调试服务端自定义Web API - 活字格V8帮助手册 - 葡萄城产品文档中心 (grapecity.com.cn)
回复 使用道具 举报
刘洋
注册会员   /  发表于:2023-2-20 21:16:18
9#
David.Zhong 发表于 2023-2-20 13:51
大佬,发布到本地调试一下,看看具体是哪报错了,报错的信息是啥。
调试服务端自定义Web API - 活字格V8帮 ...

本地调试没问题。可是本地发布之后(127.0.0.1),运行程序-->附加进程-->点击命令,不能触发代码运行。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部