2

二重の謝罪-最初に、私はASP.netに完全に慣れていないので、これは非常に素朴な質問であると確信しています。次に、ASP.NETの相対パスについてSOにすでに100の質問があるようです。残念ながら、私の質問に答えるものが見つかりません。

.ashx背景-Excelファイルにアクセスできる必要があるファイルに取り組んでいます。

ローカルで実行していて、ファイルへの絶対パスを使用している場合、すべてがうまく機能します。これが私のコードです:

<%@ WebHandler Language="C#" Class="MyHandler" %>
using System;
... [a bunch more "usings..."]
using Microsoft.Office.Interop.Excel;

public class MyHandler : IHttpHandler {
    public void ProcessRequest(HttpContext context) {
        string path = @"C:\Users\[...]\myExcelFile.xls";
        Workbook theWorkbook;
        Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
        theWorkbook = app.Workbooks.Open(path);

ただし、これをサーバーで実行し、への相対パスを使用したいと思いますmyExcelFile.xls

私のプロジェクトは次のように設定されています。

Main folder:
 - Default.aspx
 - myExcelFile.xls
 - Web.config
 - Global.asax
Styles folder
Scripts folder
Handler folder
 - MyHandler.ashx (that's reading the Excel File)
bin folder

つまり、Excelファイルがアプリケーションの「ルート」にあることがわかります。

パスを相対的なものにするために、私は次のことを試みましたが成功しませんでした。

「相対的」がmyHandler.ashxからのものであると仮定します。

string path = @"..\myExcelFile.xls":

~それが「ルート」を参照していると仮定します。

string path = @"~\myExcelFile.xls";

推測するだけ:

string path = @".\myExcelFile.xls";

ただ必死です:

string path = "myExcelFile.xls";

これらはどれも機能しませんでした。

そこで、ここでSOについて少し調べてみたところ、が見つかりましSystem.IO.Path.GetFullPathた。だから私は試しました:

string path = System.IO.Path.GetFullPath("myExcelFile.xls");

それはうまくいきませんでしたが、少なくとも私はの価値pathC:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\11.0\PinpointTool-DC.xls

もちろん-私はそれをまったく理解していません-その道は私のプロジェクトがどこにあるのかどこにもありません(つまり、私は何をしているのか理解してSystem.IO.Path.GetFullPathいません...)

最後に、試しServer.MapPath("myExcelFile.xls")ましたが、まったく機能しません(少なくともローカルでは):

Compiler Error Message: CS0103: The name 'Server' does not exist in the current context

では、どうすればこれを機能させることができますか(理想的にはローカルとサーバーの両方で?)

4

2 に答える 2

4

を使用context.Server.MapPathすることもできますが、セクションの「web.config」ファイルで定義したパスを使用して、appSettings後でアプリケーションで読み取ることもできます。

Web.config:

...
<appSettings>
    <add key="myBasePath" value="C:\Some\Path" />
</appSettings>
...

ASHXハンドラーでは、次のように記述できます。

...
string path = Path.Combine(
    ConfigurationManager.AppSettings[@"myBasePath"],
    @"myExcelFile.xls");
...

開発マシンと本番環境で異なる「web.config」ファイルを使用できます(使用する必要があります)。

サーバー上のOfficeInteropに関するJohnSaundersの2番目の発言として、次のような決定されたライブラリを使用することを強くお勧めします。

私はそれらの両方でうまく機能しました(ただし、商用)。

于 2013-02-22T15:08:10.170 に答える
3

やってみました

System.IO.Path.Combine(HttpContext.Current.Server.MapPath("~/."),"myExcelFile.xls");

これがお役に立てば幸いです

于 2013-02-22T15:05:07.490 に答える