|
@@ -21,7 +21,8 @@
|
|
<div class="ppt-wrap flex-center">
|
|
<div class="ppt-wrap flex-center">
|
|
<!-- 封面 -->
|
|
<!-- 封面 -->
|
|
<div class="ppt-item" id="cover" style="background-size:20%;">
|
|
<div class="ppt-item" id="cover" style="background-size:20%;">
|
|
- <Cover :pageInfo="coverInfo.page"></Cover>
|
|
|
|
|
|
+ <!-- <Cover :pageInfo="coverInfo.page"></Cover> -->
|
|
|
|
+ <CustomCover :pageInfo="coverInfo.page" :CoverContent="pptCoverContent" v-show="coverInfo.page"></CustomCover>
|
|
</div>
|
|
</div>
|
|
<!-- 内容 -->
|
|
<!-- 内容 -->
|
|
<div class="ppt-item" v-for="(item,index) in pageList" :key="item.id">
|
|
<div class="ppt-item" v-for="(item,index) in pageList" :key="item.id">
|
|
@@ -43,57 +44,6 @@
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
- <!-- 虚拟列表 -->
|
|
|
|
- <template v-else>
|
|
|
|
- <div class="list-wrap" id="scroller" @scroll="handleScroll">
|
|
|
|
- <div class="ppt-wrap flex-center" id="scroller-inner">
|
|
|
|
- <!-- <div class="ppt-item" v-for="(item,index) in loadList" :key="item.id" :data-set="item.title">
|
|
|
|
- <span style="font-size:24px;">第{{index}}项,title{{item.title}}</span>
|
|
|
|
- </div> -->
|
|
|
|
- <template v-for="(item) in loadList">
|
|
|
|
- <template v-if="item.index">
|
|
|
|
- <!-- 是封面 -->
|
|
|
|
- <div class="ppt-item" id="cover" v-if="coverInfo.page" :key="item.id" :data-set="item.title">
|
|
|
|
- <Cover :pageInfo="coverInfo.page"></Cover>
|
|
|
|
- </div>
|
|
|
|
- </template>
|
|
|
|
- <template v-else-if="item.idName==='back'">
|
|
|
|
- <!-- 是封底 -->
|
|
|
|
- <div class="ppt-item" id="back" :key="item.id" :data-set="item.title">
|
|
|
|
- <img src="~@/assets/img/pptlastimg.png" class="pptbg" />
|
|
|
|
- </div>
|
|
|
|
- </template>
|
|
|
|
- <template v-else>
|
|
|
|
- <!-- 是内容 -->
|
|
|
|
- <div class="ppt-item" :key="item.id" :data-set="item.title">
|
|
|
|
- <div class="title-wrap">
|
|
|
|
- {{item.title}}
|
|
|
|
- </div>
|
|
|
|
- <component
|
|
|
|
- :is="getComponentName(item.modelId)"
|
|
|
|
- :ref="`pptPage_${item.sourceIndex}`"
|
|
|
|
- :pageIndex="item.sourceIndex"
|
|
|
|
- :pageItem="item"
|
|
|
|
- type="show"
|
|
|
|
- >
|
|
|
|
- </component>
|
|
|
|
- </div>
|
|
|
|
- </template>
|
|
|
|
- </template>
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
- </template>
|
|
|
|
- <!-- 封面封底 -->
|
|
|
|
- <template v-if="isPublish&&!loadingAll">
|
|
|
|
- <div class="fixed-wrap">
|
|
|
|
- <div class="ppt-item" id="changecover">
|
|
|
|
- <Cover :pageInfo="coverInfo.page"></Cover>
|
|
|
|
- </div>
|
|
|
|
- <div class="ppt-item" id="changeback" style="overflow:hidden;">
|
|
|
|
- <img src="~@/assets/img/pptlastimg.png" class="pptbg" style="width:100%;"/>
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
- </template>
|
|
|
|
<!-- <trans-report
|
|
<!-- <trans-report
|
|
v-if="coverInfo.page"
|
|
v-if="coverInfo.page"
|
|
:transReportShow="transReportShow"
|
|
:transReportShow="transReportShow"
|
|
@@ -106,9 +56,10 @@
|
|
|
|
|
|
<script>
|
|
<script>
|
|
import Cover from './components/Cover.vue';
|
|
import Cover from './components/Cover.vue';
|
|
|
|
+import CustomCover from './components/CustomCover.vue';
|
|
import TransReport from './components/catalog/transReport.vue';
|
|
import TransReport from './components/catalog/transReport.vue';
|
|
//import {pageList} from './utils/mock';
|
|
//import {pageList} from './utils/mock';
|
|
-import {countComponentName,pptInit,pptConfigInit,toTextProps,toJson,svg2Base64,getImgRealSize,calcScale,getShapeOptions,createRandomCode,getTableData} from './utils/untils';
|
|
|
|
|
|
+import {countComponentName,pptConfigInit,toTextProps,toJson,svg2Base64,getImgRealSize,calcScale,getShapeOptions,createRandomCode,getTableData} from './utils/untils';
|
|
import {marginTop,modelConfig,pptSlideMaster} from './utils/config';
|
|
import {marginTop,modelConfig,pptSlideMaster} from './utils/config';
|
|
import pptmixin from '../mixins/pptMixins';
|
|
import pptmixin from '../mixins/pptMixins';
|
|
import mixins from '../mixins/mixins';
|
|
import mixins from '../mixins/mixins';
|
|
@@ -125,7 +76,7 @@ import {uploadFileDirect} from "@/utils/common.js"
|
|
HightchartsExport(Highcharts)
|
|
HightchartsExport(Highcharts)
|
|
HighchartszhCN(Highcharts)
|
|
HighchartszhCN(Highcharts)
|
|
export default {
|
|
export default {
|
|
- components: {Cover,TransReport},
|
|
|
|
|
|
+ components: {Cover,TransReport,CustomCover},
|
|
mixins:[pptmixin,mixins,virtualScroll],
|
|
mixins:[pptmixin,mixins,virtualScroll],
|
|
data() {
|
|
data() {
|
|
return {
|
|
return {
|
|
@@ -184,12 +135,8 @@ export default {
|
|
});
|
|
});
|
|
this.isPublish = true
|
|
this.isPublish = true
|
|
if(this.loadingAll){
|
|
if(this.loadingAll){
|
|
- await this.pageToPptx()
|
|
|
|
- }else{
|
|
|
|
- //将滚动条置顶
|
|
|
|
- this.scroller.scrollTop = 0
|
|
|
|
- await this.pageToPptx()
|
|
|
|
- }
|
|
|
|
|
|
+ await this.pageToPptx()
|
|
|
|
+ }
|
|
this.isPublish = false
|
|
this.isPublish = false
|
|
},
|
|
},
|
|
//计算ppt的版式名称
|
|
//计算ppt的版式名称
|
|
@@ -281,7 +228,6 @@ export default {
|
|
async pageToPptx(){
|
|
async pageToPptx(){
|
|
//开始计时
|
|
//开始计时
|
|
const start = Date.now()
|
|
const start = Date.now()
|
|
- //let pptx = pptInit(new pptxgen(),this.LayoutType);
|
|
|
|
const SlideMaster = _.cloneDeep(pptSlideMaster)
|
|
const SlideMaster = _.cloneDeep(pptSlideMaster)
|
|
SlideMaster.objects[1] = {image: {x:0,y:0,w:10,h:7,path:this.pptBgImage}}
|
|
SlideMaster.objects[1] = {image: {x:0,y:0,w:10,h:7,path:this.pptBgImage}}
|
|
let pptx = pptConfigInit(new pptxgen(),this.LayoutType,'ch',SlideMaster,this.pptBgImage)
|
|
let pptx = pptConfigInit(new pptxgen(),this.LayoutType,'ch',SlideMaster,this.pptBgImage)
|
|
@@ -289,17 +235,7 @@ export default {
|
|
pptx.addSlide()
|
|
pptx.addSlide()
|
|
const length = this.pageList.length;
|
|
const length = this.pageList.length;
|
|
for (let i = 0; i < length; i++) {
|
|
for (let i = 0; i < length; i++) {
|
|
- //console.log(`正在生成,第${i+1}页...`,`lastVisibleItemIndex:`,this.lastVisibleItemIndex)
|
|
|
|
- if(!this.loadingAll){
|
|
|
|
- if(this.lastVisibleItemIndex<=i+this.buffer+1){
|
|
|
|
- //将滚动条触底,加载下一页
|
|
|
|
- const {scrollHeight} = this.scroller
|
|
|
|
- this.scroller.scrollTop = scrollHeight
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
let slide = pptx.addSlide({ masterName: pptSlideMaster.title });
|
|
let slide = pptx.addSlide({ masterName: pptSlideMaster.title });
|
|
- //添加背景图片
|
|
|
|
- //slide.background = { path: "/static/pptnextimg.png" };
|
|
|
|
slide.addText(this.pageList[i].title, {
|
|
slide.addText(this.pageList[i].title, {
|
|
placeholder:"slideTitle",
|
|
placeholder:"slideTitle",
|
|
x:'10%',
|
|
x:'10%',
|
|
@@ -381,7 +317,6 @@ export default {
|
|
valign:'top'
|
|
valign:'top'
|
|
})
|
|
})
|
|
}else if(imgData2){
|
|
}else if(imgData2){
|
|
- //console.log('src',imgData2)
|
|
|
|
const realSize = getImgRealSize(imgData2Obj)
|
|
const realSize = getImgRealSize(imgData2Obj)
|
|
const percentWidth = Number(width.substring(0,width.length-1))
|
|
const percentWidth = Number(width.substring(0,width.length-1))
|
|
const percentHeight = Number(height.substring(0,height.length-1))
|
|
const percentHeight = Number(height.substring(0,height.length-1))
|
|
@@ -418,7 +353,6 @@ export default {
|
|
if(['shape','line'].includes(layers[j].type)){
|
|
if(['shape','line'].includes(layers[j].type)){
|
|
const scale = calcScale({w:906,h:906*0.7},{w:$('.ppt-item').width(),h:$('.ppt-item').width()*this.coefficient})
|
|
const scale = calcScale({w:906,h:906*0.7},{w:$('.ppt-item').width(),h:$('.ppt-item').width()*this.coefficient})
|
|
let options = getShapeOptions(layers[j],position,scale)
|
|
let options = getShapeOptions(layers[j],position,scale)
|
|
- //console.log('options',options)
|
|
|
|
if(layers[j].shapeType==='Circle'){ //circle的points太复杂,直接用插件预设的
|
|
if(layers[j].shapeType==='Circle'){ //circle的points太复杂,直接用插件预设的
|
|
slide.addShape('ellipse', options);
|
|
slide.addShape('ellipse', options);
|
|
}else{
|
|
}else{
|
|
@@ -458,7 +392,6 @@ export default {
|
|
|
|
|
|
//为了把封面放到第一页,操作pptx.slides达不成想要的效果,于是弄了个pptx2
|
|
//为了把封面放到第一页,操作pptx.slides达不成想要的效果,于是弄了个pptx2
|
|
//将封面放在最后生成是因为htmlToCanvans占用太多内存会导致页面假死
|
|
//将封面放在最后生成是因为htmlToCanvans占用太多内存会导致页面假死
|
|
- //let pptx2 = pptInit(new pptxgen(),this.LayoutType);
|
|
|
|
let pptx2 = pptConfigInit(new pptxgen(),this.LayoutType,'ch',SlideMaster,this.pptBgImage)
|
|
let pptx2 = pptConfigInit(new pptxgen(),this.LayoutType,'ch',SlideMaster,this.pptBgImage)
|
|
//添加封面
|
|
//添加封面
|
|
let cover = pptx2.addSlide()
|
|
let cover = pptx2.addSlide()
|
|
@@ -473,14 +406,14 @@ export default {
|
|
size: { type: "contain" },
|
|
size: { type: "contain" },
|
|
})
|
|
})
|
|
//生成的ppt需要可以在封面页更改标题和类型,所以封面信息手动写入
|
|
//生成的ppt需要可以在封面页更改标题和类型,所以封面信息手动写入
|
|
- const coverInfo = [
|
|
|
|
- //{text:'—————————————————————————————————\n',options:{fontSize:16*0.75,breakLine:true}},
|
|
|
|
|
|
+ /* const coverInfo = [
|
|
|
|
+ {text:'—————————————————————————————————\n',options:{fontSize:16*0.75,breakLine:true}},
|
|
{text:this.coverInfo.page.Title,options:{fontSize:28*0.75,breakLine:true}},
|
|
{text:this.coverInfo.page.Title,options:{fontSize:28*0.75,breakLine:true}},
|
|
{text:`\n— ${this.pptCoverCompenyName||'ETA'} ● ${this.coverInfo.page.ReportType} —`,
|
|
{text:`\n— ${this.pptCoverCompenyName||'ETA'} ● ${this.coverInfo.page.ReportType} —`,
|
|
options:{fontSize:16*0.75,breakLine:false}},
|
|
options:{fontSize:16*0.75,breakLine:false}},
|
|
{text:`\n${this.pptCoverDepartName||'投研部'}`,options:{fontSize:16*0.75,breakLine:true}},
|
|
{text:`\n${this.pptCoverDepartName||'投研部'}`,options:{fontSize:16*0.75,breakLine:true}},
|
|
{text:this.coverInfo.page.PptDate,options:{fontSize:16*0.75,breakLine:true}},
|
|
{text:this.coverInfo.page.PptDate,options:{fontSize:16*0.75,breakLine:true}},
|
|
- //{text:'\n—————————————————————————',options:{fontSize:16*0.75,breakLine:true}}
|
|
|
|
|
|
+ {text:'\n—————————————————————————',options:{fontSize:16*0.75,breakLine:true}}
|
|
]
|
|
]
|
|
cover.addText(coverInfo,{
|
|
cover.addText(coverInfo,{
|
|
x:'38%',
|
|
x:'38%',
|
|
@@ -490,7 +423,9 @@ export default {
|
|
color:(this.pptCoverTextColor||'#ffffff').slice(1),
|
|
color:(this.pptCoverTextColor||'#ffffff').slice(1),
|
|
align:'center',
|
|
align:'center',
|
|
fontFace:'SimHei'
|
|
fontFace:'SimHei'
|
|
- })
|
|
|
|
|
|
+ }) */
|
|
|
|
+ //自定义封面页的内容
|
|
|
|
+ cover = this.setPPTCover(cover,this.pptCoverContent,this.coverInfo.page.Title)
|
|
//遍历pptx.slides,重新给每一项的部分属性赋值,再推入pptx2.slides中
|
|
//遍历pptx.slides,重新给每一项的部分属性赋值,再推入pptx2.slides中
|
|
//第一页不需要,因为是空白的
|
|
//第一页不需要,因为是空白的
|
|
for(let i=1;i<pptx.slides.length;i++){
|
|
for(let i=1;i<pptx.slides.length;i++){
|
|
@@ -746,10 +681,6 @@ export default {
|
|
mounted(){
|
|
mounted(){
|
|
this.init()
|
|
this.init()
|
|
this._scrollTop = 0
|
|
this._scrollTop = 0
|
|
- if(!this.loadingAll){
|
|
|
|
- this.scroller = document.getElementById('scroller')
|
|
|
|
- this.scrollerInner = document.getElementById("scroller-inner")
|
|
|
|
- }
|
|
|
|
},
|
|
},
|
|
updated(){
|
|
updated(){
|
|
/*
|
|
/*
|