2017-03-12 9 views
1

1枚のブックに2枚のシートを持つExcelファイルを作成したいと思います。次のコードを使用しようとすると、開くことができないブックが作成されます。 しかし、1枚のシートを作成すると、そのシートは機能します。 両方のケースの添付コードを見つけて、私が逃したものを教えてください。MarkLogicでマルチシートエクセルを作成するには

シングルシートを作成する(作業中)。 2枚が優れて作成

declare namespace ms = "http://schemas.openxmlformats.org/spreadsheetml/2006/main" ; 
declare namespace ns2 = "http://www.example.com/"; 

declare function local:AgentReport() 
{ 
<AgentReport> 
    <Report> 
     <GroupNumber>1</GroupNumber> 
     <Quotes>1</Quotes> 
     <Converted>1</Converted> 
     <Conv_Rate>1</Conv_Rate> 
    </Report> 
    <Report> 
     <GroupNumber>2</GroupNumber> 
     <Quotes>2</Quotes> 
     <Converted>2</Converted> 
     <Conv_Rate>2</Conv_Rate> 
    </Report> 
</AgentReport> 
}; 
declare function local:getRows($x) as element(ms:row)* 
{ 
    let $first-row := 
      <ms:row> 
      { 
      for $i in $x/*/*[1]/child::element() 
      return 
      <ms:c t="inlineStr"> <ms:is> <ms:t>{fn:node-name($i)}</ms:t> </ms:is> </ms:c> 
      } 
      </ms:row> 
    return 
     (
     $first-row, 

     for $each in $x//Report 
     return 
     <ms:row> 
     { 
     for $i in $each/* 
     return 
     <ms:c t="inlineStr"> <ms:is> <ms:t>{$i/string()}</ms:t> </ms:is> </ms:c> 
     } 
     </ms:row> 
     ) 
}; 

declare function local:generate-simple-xl-ooxml($content-types as node(), $workbook as node(), $rels as node(), $workbookrels as node(), $sheet1 as node()) as binary() 
{ 
    let $manifest := <parts xmlns="xdmp:zip"> 
         <part>[Content_Types].xml</part> 
         <part>workbook.xml</part> 
         <part>_rels/.rels</part> 
         <part>_rels/workbook.xml.rels</part> 
         <part>sheet1.xml</part> 
         </parts> 
    let $parts := ($content-types, $workbook, $rels, $workbookrels, $sheet1) 
    return xdmp:zip-create($manifest, $parts) 
}; 

let $content-types := <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"> 
         <Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/> 
         <Default Extension="xml" ContentType="application/xml"/> 
         <Override PartName="/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/> 
         <Override PartName="/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/> 
         </Types> 

let $workbook := <workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"> 
        <sheets> 
        <sheet name="Sheet1" sheetId="1" r:id="rId1" /> 
        </sheets> 
        </workbook> 

let $rels := <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> 
       <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="workbook.xml"/> 
       </Relationships> 

let $workbookrels := <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> 
         <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="sheet1.xml"/> 
         </Relationships> 

let $date := xs:string(fn:current-date()) 

let $day := fn:tokenize($date, "\+")[1] 

let $xml := local:AgentReport() 

let $page := xdmp:tidy(xdmp:quote($xml), 
         <options xmlns="xdmp:tidy"> 
         <input-xml>true</input-xml> 
         </options>)[2] 

let $tables := $page 

let $sheet1 := <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> 
       <sheetData> {local:getRows($tables)} </sheetData> 
       </worksheet> 

let $package := local:generate-simple-xl-ooxml($content-types, $workbook, $rels, $workbookrels, $sheet1) 

let $filename := "ExcelTest.xlsx" 

let $disposition := concat("attachment; filename=""",$filename,"""") 

let $x := xdmp:add-response-header("Content-Disposition", $disposition) 

let $x := xdmp:set-response-content-type("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") 

let $insertReport := xdmp:document-insert(concat("/GroupNumberReport/Group-", $day, ".xlsx"), $package,(), "GroupReport") 

let $saveReport := xdmp:save(concat("C:\EriePoc\DataStage-Demo\Report\Group-", $day, ".xlsx"), $package) 

return fn:true() 

(すなわちが壊れexcelsheetを作成する作業ではありません)。

declare namespace ms = "http://schemas.openxmlformats.org/spreadsheetml/2006/main" ; 
declare namespace ns2 = "http://www.example.com/"; 

declare function local:AgentReport() 
{ 
<AgentReport> 
    <Report> 
     <GroupNumber>1</GroupNumber> 
     <Quotes>1</Quotes> 
     <Converted>1</Converted> 
     <Conv_Rate>1</Conv_Rate> 
    </Report> 
    <Report> 
     <GroupNumber>2</GroupNumber> 
     <Quotes>2</Quotes> 
     <Converted>2</Converted> 
     <Conv_Rate>2</Conv_Rate> 
    </Report> 
</AgentReport> 

}; 

declare function local:getRows($x) as element(ms:row)* 
{ 
    let $first-row := 
      <ms:row> 
      { 
      for $i in $x/*/*[1]/child::element() 
      return 
      <ms:c t="inlineStr"> <ms:is> <ms:t>{fn:node-name($i)}</ms:t> </ms:is> </ms:c> 
      } 
      </ms:row> 
    return 
     (
     $first-row, 

     for $each in $x//Report 
     return 
     <ms:row> 
     { 
     for $i in $each/* 
     return 
     <ms:c t="inlineStr"> <ms:is> <ms:t>{$i/string()}</ms:t> </ms:is> </ms:c> 
     } 
     </ms:row> 
     ) 
}; 

declare function local:generate-simple-xl-ooxml($content-types as node(), $workbook as node(), $rels as node(), $workbookrels as node(), $sheet1 as node(), $sheet2 as node()) as binary() 
{ 
    let $manifest := <parts xmlns="xdmp:zip"> 
         <part>[Content_Types].xml</part> 
         <part>workbook.xml</part> 
         <part>_rels/.rels</part> 
         <part>_rels/workbook.xml.rels</part> 
         <part>sheet1.xml</part> 
         <part>sheet2.xml</part> 
         </parts> 
    let $parts := ($content-types, $workbook, $rels, $workbookrels, $sheet1, $sheet2) 
    return xdmp:zip-create($manifest, $parts) 
}; 

let $content-types := <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"> 
         <Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/> 
         <Default Extension="xml" ContentType="application/xml"/> 
         <Override PartName="/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/> 
         <Override PartName="/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/> 
           <Override PartName="/sheet2.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/> 
         </Types> 

let $workbook := <workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"> 
        <sheets> 
        <sheet name="Sheet1" sheetId="1" r:id="rId1" /> 
          <sheet name="Sheet2" sheetId="2" r:id="rId2" /> 
        </sheets> 
        </workbook> 

let $rels := <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> 
       <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="workbook.xml"/> 
        <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="workbook.xml"/>    
       </Relationships> 

let $workbookrels := <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> 
         <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="sheet1.xml"/> 
           <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="sheet2.xml"/>      
         </Relationships> 

let $date := xs:string(fn:current-date()) 

let $day := fn:tokenize($date, "\+")[1] 

let $xml := local:AgentReport() 

let $page := xdmp:tidy(xdmp:quote($xml), 
         <options xmlns="xdmp:tidy"> 
         <input-xml>true</input-xml> 
         </options>)[2] 

let $tables := $page 

let $sheet1 := <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> 
       <sheetData> {local:getRows($tables)} </sheetData> 
       </worksheet> 

let $sheet2 := <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> 
       <sheetData> {local:getRows($tables)} </sheetData> 
       </worksheet> 

let $package := local:generate-simple-xl-ooxml($content-types, $workbook, $rels, $workbookrels, $sheet1, $sheet2) 

let $filename := "ExcelTest.xlsx" 

let $disposition := concat("attachment; filename=""",$filename,"""") 

let $x := xdmp:add-response-header("Content-Disposition", $disposition) 

let $x := xdmp:set-response-content-type("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") 

let $insertReport := xdmp:document-insert(concat("/GroupNumberReport/Group-", $day, ".xlsx"), $package,(), "GroupReport") 

let $saveReport := xdmp:save(concat("C:\EriePoc\DataStage-Demo\Report\Group-", $day, ".xlsx"), $package) 

return fn:true() 
+0

確かに、私はそれを削除しました –

答えて

1

問題は、不要なRelationship要素が追加され、問題が発生したことが原因です。

あなた $rels変数に変更し

残念ながら
let $rels := 
    <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> 
    <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="workbook.xml"/>   
    </Relationships> 

を、MS Officeのは、多くの場合、またはどのようなエラーがあるのいずれかの有用な指標を提供していません。物事はうまくいくのか、何が間違っているのかについての情報はほとんどありません。

小さな変更をテストしたり、MS Officeアプリケーション内の作業中のインスタンスファイルから作業したり、保存したり、* .xlsxファイル内の個々のファイルを比較して、何もない。

+0

ありがとうハンセン。出来た –

関連する問題