php - 为Excel创建OData提供程序 - Power查询显示$ metadata xml

标签 php excel odata

我正在创建一个odata提供程序,用于excel和php库:https://github.com/Algo-Web/POData
我已经成功地在本地网络的浏览器中提供了一个示例数据集:
http://dss.example.com/proto/odata.svc/Samples?$格式化=JSON

{
  "value":[
    {
      "id":"1","firstName":"Rebbecca","lastName":"Didio","companyName":"Brandt, Jonathan F Esq","address":"171 E 24th St","city":"Leith","state":"TA","post":"7315","phone1":"03-8174-9123","phone2":"0458-665-290","email":"rebbecca.didio@didio.com.au","web":"http://www.brandtjonathanfesq.com.au"
    },{
      "id":"2","firstName":"Stevie","lastName":"Hallo","companyName":"Landrum Temporary Services","address":"22222 Acoma St","city":"Proston","state":"QL","post":"4613","phone1":"07-9997-3366","phone2":"0497-622-620","email":"stevie.hallo@hotmail.com","web":"http://www.landrumtemporaryservices.com.au"
    },{
      "id":"3","firstName":"Mariko","lastName":"Stayer","companyName":"Inabinet, Macre Esq","address":"534 Schoenborn St #51","city":"Hamel","state":"WA","post":"6215","phone1":"08-5558-9019","phone2":"0427-885-282","email":"mariko_stayer@hotmail.com","web":"http://www.inabinetmacreesq.com.au"
    },{
      "id":"4","firstName":"Gerardo","lastName":"Woodka","companyName":"Morris Downing & Sherred","address":"69206 Jackson Ave","city":"Talmalmo","state":"NS","post":"2640","phone1":"02-6044-4682","phone2":"0443-795-912","email":"gerardo_woodka@hotmail.com","web":"http://www.morrisdowningsherred.com.au"
    },{
      "id":"5","firstName":"Mayra","lastName":"Bena","companyName":"Buelt, David L Esq","address":"808 Glen Cove Ave","city":"Lane Cove","state":"NS","post":"1595","phone1":"02-1455-6085","phone2":"0453-666-885","email":"mayra.bena@gmail.com","web":"http://www.bueltdavidlesq.com.au"
    },{
      "id":"6","firstName":"Idella","lastName":"Scotland","companyName":"Artesian Ice & Cold Storage Co","address":"373 Lafayette St","city":"Cartmeticup","state":"WA","post":"6316","phone1":"08-7868-1355","phone2":"0451-966-921","email":"idella@hotmail.com","web":"http://www.artesianicecoldstorageco.com.au"
    },
    ...
}

以及http://dss.example.com/proto/odata.svc/$元数据上的相应元数据
<?xml version="1.0" encoding="UTF-8"?>
<edmx:Edmx xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" xmlns="http://schemas.microsoft.com/ado/2009/11/edm" xmlns:cg="http://schemas.microsoft.com/ado/2006/04/codegeneration" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" Version="3.0">
    <edmx:DataServices m:MaxDataServiceVersion="3.0" m:DataServiceVersion="3.0">
        <Schema Namespace="Proto">
            <EntityType OpenType="false" Abstract="false" Name="Sample">
                <Key>
                    <PropertyRef Name="id"/>
                </Key>
                <Property Name="id" Type="Edm.Int64" Nullable="false"/>
                <Property Name="firstName" Type="Edm.String" Nullable="false"/>
                <Property Name="lastName" Type="Edm.String" Nullable="false"/>
                <Property Name="companyName" Type="Edm.String" Nullable="false"/>
                <Property Name="address" Type="Edm.String" Nullable="false"/>
                <Property Name="city" Type="Edm.String" Nullable="false"/>
                <Property Name="state" Type="Edm.String" Nullable="false"/>
                <Property Name="post" Type="Edm.String" Nullable="false"/>
                <Property Name="phone1" Type="Edm.String" Nullable="false"/>
                <Property Name="phone2" Type="Edm.String" Nullable="false"/>
                <Property Name="email" Type="Edm.String" Nullable="false"/>
                <Property Name="web" Type="Edm.String" Nullable="false"/>
            </EntityType>
            <EntityContainer Name="Proto" m:IsDefaultEntityContainer="true">
                <EntitySet Name="Proto" EntityType="Proto.Sample" cg:GetterAccess="Public"/>
            </EntityContainer>
        </Schema>
    </edmx:DataServices>
</edmx:Edmx>

通过记录邮件头,我确认excel提出了以下请求:
请求1获取所有数据。库用json对此作出响应
User-Agent: Microsoft.Data.Mashup (https://go.microsoft.com/fwlink/?LinkID=304225)
MaxDataServiceVersion: 3.0
OData-MaxVersion: 4.0
Accept: application/json;odata.metadata=minimal;q=1.0,application/json;odata=minimalmetadata;q=0.9,application/atomsvc+xml;q=0.8,application/atom+xml;q=0.8,application/xml;q=0.7,text/plain;q=0.7
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

请求2仅用于json
User-Agent: Microsoft.Data.Mashup (https://go.microsoft.com/fwlink/?LinkID=304225)
OData-MaxVersion: 4.0
Accept: application/json;odata.metadata=minimal
Accept-Encoding: gzip, deflate
Host: ds1.example.com

库用json对此作出响应
atom/xml请求3
经过反复试验,我决定在这里返回元数据
User-Agent: Microsoft.Data.Mashup (https://go.microsoft.com/fwlink/?LinkID=304225)
MaxDataServiceVersion: 3.0
Accept: application/json;odata=minimalmetadata;q=1.0,application/atomsvc+xml;q=0.8,application/atom+xml;q=0.8,application/xml;q=0.7,text/plain;q=0.7
Accept-Encoding: gzip, deflate
Host: ds1.example.com
---Request Start: /proto/odata.svc/Samples---
User-Agent: Microsoft.Data.Mashup (https://go.microsoft.com/fwlink/?LinkID=304225)
MaxDataServiceVersion: 3.0
Accept: application/atomsvc+xml;q=0.8,application/atom+xml;q=0.8,application/xml;q=0.7,text/plain;q=0.7
Accept-Encoding: gzip, deflate

但是,这将在powerquery中显示xml元数据作为查询的结果。
我还修改了odata后端,以便在通过浏览器请求时返回xml:http://dss.example.com/proto/odata.svc/samples
对于此变量,Excel显示错误:
“OData:给定的URL既不指向OData服务也不指向源:”
我是odata新手,这里的目的是通过web门户传递表数据,而不需要在运行excel的机器上安装任何东西,否则我将使用odbc

最佳答案

由AA>
odata支持两种表示资源的格式,即基于xml的
atom格式和json格式。如http中所述
规范[RFC2616],客户可以表示他们的偏好
通过包含带有
它可以处理的mime类型列表。
这意味着您只能使用两个documentationatom和json。
但是,默认情况下metadata返回xml格式。这意味着您可以在默认情况下更改格式和resourcepath。
algo web/podata有BaseService.php
有targetKind枚举。TargetKind有资源。
资源是实体(如项目中的Samples)。
我认为你需要改变一下情况:

case TargetKind::RESOURCE():
                return HttpProcessUtility::selectMimeType(
                    $requestAcceptText,
                    array_merge(
                        [MimeTypes::MIME_APPLICATION_ATOM],
                        $baseMimeTypes
                    )
                );

并将BaseService.php更改为MimeTypes::MIME_APPLICATION_ATOM
例如
return HttpProcessUtility::selectMimeType(
                    $requestAcceptText,
                    array_merge(
                        [MimeTypes::MIME_APPLICATION_XML],
                        $baseMimeTypes
                    )
  );

关于php - 为Excel创建OData提供程序 - Power查询显示$ metadata xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53602551/

相关文章:

PHP-如何根据另一个行表创建一些列/字段

php - PayPal PHP SDK - 付款创建不适用于生产 - 空响应

php - 将 MYSQL 数据中的两个数组相乘成一个新的 PHP 数组

excel - .NET 4.0 的 F# 和 Excel 集成(Visual Studio 2010 Beta 1)

json - OData 序列化

php - 自动检索 bsub 的结果

python - 使用 Python 将 VBA 代码解析为更小的代码片段

sql-server - 将存储过程结果导出到带有列名称的Excel

error-handling - 创建通话后显示后端错误消息

asp.net - 可以手动将 OData 参数应用于 `.AsQueryable()` 的结果吗?