Files
dataelement--bisheng/docker/office/bisheng/all.js
T
2026-07-13 13:36:36 +08:00

488 lines
16 KiB
JavaScript

(function (window, undefined) {
let selectText = ''
window.Asc.plugin.init = function (e) {
selectText = e
}
window.Asc.plugin.event_onClick = function () {
selectText = ''
}
window.Asc.plugin.button = function (id) {
}
const EventMap = {
sendToParent (method, data) {
let params = {
type: 'onExternalFrameMessage',
method,
data
}
window.top.postMessage(JSON.stringify(params), location.origin)
},
focusInDocument (data) {
window.Asc.scope.field = {
id: data.id,
fieldFlag: data.fieldFlag,
$index: data.$index || 1
}
window.Asc.plugin.callCommand(function () {
let field = Asc.scope.field || {}
let index = field.$index ? field.$index : 1
let oDoc = Api.GetDocument()
let flag = `{{${field.fieldFlag}}}`
let oRange = oDoc.Search(flag)
let cur = 1
for (let i = 0; i < oRange.length; i++) {
if (oRange[i].GetText() === flag) {
if (cur === index) {
oRange[i].Select()
break
}
cur = cur + 1
}
}
})
},
focusTableInDoc (data) {
window.Asc.scope.marker = data.marker
window.Asc.plugin.callCommand(function () {
let flag = Asc.scope.marker || ''
let oDoc = Api.GetDocument()
let oRange = oDoc.GetBookmarkRange(flag)
oRange.Select()
})
},
addMarker (data) {
let flag = '{{' + data.fieldFlag + '}}'
window.Asc.plugin.executeMethod('PasteText', [flag])
},
addBookMarker (data) {
window.Asc.scope.value = data
window.Asc.plugin.callCommand(function () {
let oDoc = Api.GetDocument()
let range = oDoc.GetRangeBySelect()
let params = {
type: 'onExternalFrameMessage',
method: 'addBookMarker'
}
let marker = Asc.scope.value
let markers = []
if (range) {
let texts = range.GetText()
let pars = range.GetAllParagraphs() || []
let txtList = []
for (let i = 0; i < pars.length; i++) {
let text = pars[i].GetText()
txtList.push(text)
}
let table = pars[0] ? pars[0].GetParentTable() : null
let count = table ? table.GetRowsCount() : 0
for (let i = 0; i < count; i++) {
let row = table.GetRow(i)
let firstCell = row.GetCell(0)
let cellText = firstCell ? firstCell.GetContent().GetElement(0).GetText() : ''
// 序号
let isNumbering = false
if (firstCell.GetContent().GetElement(0).GetNumbering()) {
isNumbering = true
let cellCount = row.GetCellsCount()
for (let j = 1; j < cellCount; j++) {
let cellItem = row.GetCell(j)
if (!cellItem.GetContent().GetElement(0).GetNumbering()) {
cellText = cellItem.GetContent().GetElement(0).GetText()
firstCell = cellItem
break
}
}
}
if (cellText && txtList.includes(cellText)) {
let cRange = firstCell.Search(cellText)[0]
cRange.AddBookmark(marker.key + i)
markers.push(marker.key + i)
}
}
// range.AddBookmark(Asc.scope.value.key)
params.data = Object.assign(marker, {
key: markers.join(','),
texts
})
} else {
params.data = false
}
window.top.postMessage(JSON.stringify(params), location.origin)
})
},
deleteBookMarker (data) {
window.Asc.scope.value = data
window.Asc.plugin.callCommand(function () {
let oDoc = Api.GetDocument()
let markers = Asc.scope.value || []
for (let i = 0; i < markers.length; i++) {
oDoc.DeleteBookmark(markers[i])
}
})
},
// 批量删除循环应用内标签
deleteLoopApp (list) {
window.Asc.scope.value = list
window.Asc.plugin.callCommand(function () {
let list = window.Asc.scope.value || []
let oDoc = Api.GetDocument()
list.forEach(row => {
if (row.loopType === 0) {
oDoc.SearchAndReplace({ searchString: `{{${row.startTag}}}`, replaceString: '' }, `{{${row.startTag}}}`, '')
oDoc.SearchAndReplace({ searchString: `{{${row.endTag}}}`, replaceString: '' }, `{{${row.endTag}}}`, '')
} else if (row.loopType === 1) {
oDoc.DeleteBookmark(row.bookmark)
}
})
})
},
// 更新占位符
replaceMarker (data) {
window.Asc.scope.st = '{{' + data.newValue + '}}'
// 原来的值
if (data.oldValue) {
window.Asc.scope.old = '{{' + data.oldValue + '}}'
} else {
this.addMarker(data)
return
}
window.Asc.plugin.callCommand(function () {
let oDocument = Api.GetDocument()
oDocument.SearchAndReplace({ searchString: Asc.scope.old, replaceString: Asc.scope.st }, Asc.scope.old, Asc.scope.st)
}, false)
},
// 查找并插入占位符
findAndInsertMarker (data) {
window.Asc.scope.st = '{{' + data.fieldName + '}}'
window.Asc.scope.searchStr = data.fieldValue
window.Asc.plugin.callCommand(function () {
let oDocument = Api.GetDocument()
oDocument.SearchAndReplace({ searchString: Asc.scope.searchStr, replaceString: Asc.scope.st }, Asc.scope.searchStr, Asc.scope.st)
}, false)
},
insertPosition (data) {
if (!selectText) {
let postData = {
text: selectText,
...data,
selected: false
}
this.sendToParent('addRange', postData)
return false
}
window.Asc.scope.postData = data
window.Asc.plugin.callCommand(function() {
let postData = Asc.scope.postData || {}
let oDoc = Api.GetDocument()
let oRange = oDoc.GetRangeBySelect()
let selectText = oRange.GetText()
let oAllPar = oRange.GetAllParagraphs()
let oPar = oAllPar[oAllPar.length - 1]
let parText = oPar.GetText()
if (oAllPar.length > 1) {
oRange.AddText(`{{${postData.start}}}`, 'before')
if (selectText.includes(parText)) {
let newRange = oPar.GetRange(0, parText.length - 1)
newRange.AddText(`{{${postData.end}}}`, 'after')
} else {
oRange.AddText(`{{${postData.end}}}`, 'after')
}
} else {
let isEnd = parText.substr(0 - selectText.length) === selectText
isEnd = isEnd || selectText.includes(parText)
console.log('end = ', isEnd)
let start = Math.max(parText.indexOf(selectText), 0)
let end = start + Math.min(parText.length, selectText.length) - 1
let newRange = oPar.GetRange(start, end)
oRange.AddText(`{{${postData.start}}}`, 'before')
newRange.AddText(`{{${postData.end}}}`, 'after')
}
postData.selected = true
postData.text = selectText
let params = {
type: 'onExternalFrameMessage',
method: 'addRange',
data: postData
}
window.top.postMessage(JSON.stringify(params), location.origin)
})
},
deletePosition (data) {
window.Asc.scope.range = data
window.Asc.plugin.callCommand(function () {
let oDocument = Api.GetDocument()
let { start, end } = Asc.scope.range
let markers = [`{{${start}}}`, `{{${end}}}`]
for (let j = 0; j < markers.length; j++) {
oDocument.SearchAndReplace({ searchString: markers[j], replaceString: '' }, markers[j], '')
}
})
},
deletePositionMarker (data) {
window.Asc.scope.data = data
window.Asc.plugin.callCommand(function () {
let oDocument = Api.GetDocument()
let markers = Asc.scope.data || []
for (let j = 0; j < markers.length; j++) {
oDocument.SearchAndReplace({ searchString: markers[j], replaceString: '' }, markers[j], '')
}
})
},
deletePositionArray (data) {
window.Asc.scope.data = data
window.Asc.plugin.callCommand(function () {
let oDocument = Api.GetDocument()
let markers = Asc.scope.data || []
for (let j = 0; j < markers.length; j++) {
oDocument.SearchAndReplace({ searchString: markers[j], replaceString: '' }, markers[j], '')
}
})
},
replaceRangePosition (data) {
window.Asc.scope.list = data
window.Asc.plugin.callCommand(function () {
let list = Asc.scope.list || []
let oDocument = Api.GetDocument()
list.forEach(row => {
oDocument.SearchAndReplace({ searchString: row.str, replaceString: row.newStr }, row.str, row.newStr)
})
})
},
delMarker (data) {
let fields = []
data.forEach(item => {
fields.push({
text: '{{' + item.fieldFlag + '}}',
type: 'field'
})
})
window.Asc.scope.st = fields
window.Asc.plugin.callCommand(function () {
let oDocument = Api.GetDocument()
let markers = Asc.scope.st.slice(0)
for (let j = 0; j < markers.length; j++) {
let marker = markers[j]
if (marker.type === 'field') {
oDocument.SearchAndReplace({ searchString: marker.text, replaceString: '' })
}
}
})
},
delMarkerGroup (data) {
this.delMarker(data.fields)
},
// excel
insertCellName (field) {
window.Asc.scope.field = field
window.Asc.plugin.callCommand(function () {
let fieldItem = Asc.scope.field
let sheetObj = Api.GetActiveSheet()
let sheetName = sheetObj.GetName()
let oRange = Api.GetSelection()
let oCount = oRange.GetCount()
let params = {
type: 'onExternalFrameMessage',
method: 'addCellName'
}
if (oCount !== 1) {
params.data = false
} else {
let oAddr = oRange.GetAddress(true, true, '', false)
let sheetFlag = `${sheetName}!${oAddr}`
// let name = [fieldItem.fieldName, 'DEF', fieldItem.id].join('')
// let nameObj = sheetObj.GetDefName(name)
// console.log('inser cell before = ', name, sheetFlag, nameObj)
// let result = sheetObj.AddDefName(name, sheetFlag)
// console.log('insert cell ', name, sheetFlag, result)
fieldItem.fieldFlag = sheetFlag
fieldItem.$success = oAddr !== ''
params.data = fieldItem
}
window.top.postMessage(JSON.stringify(params), location.origin)
})
},
getFocusedCell () {
window.Asc.plugin.callCommand(function () {
let sheetObj = Api.GetActiveSheet()
let sheetName = sheetObj.GetName()
let oRange = Api.GetSelection()
let params = {
type: 'onExternalFrameMessage',
method: 'getFocusedCell'
}
let oAddr = oRange.GetAddress(true, true, '', false)
let sheetFlag = `${sheetName}!${oAddr}`
params.data = sheetFlag
window.top.postMessage(JSON.stringify(params), location.origin)
})
},
loadFileFlags (data) {
window.Asc.scope.list = data
window.Asc.plugin.callCommand(function () {
let list = Asc.scope.list || []
let oDocument = Api.GetDocument()
let oParCount = oDocument.GetElementsCount()
let dataMap = {}
for (let i = 0; i < oParCount; i++) {
let oPar = oDocument.GetElement(i)
let ctype = oPar.GetClassType()
if (ctype === 'table') {
list.forEach(row => {
let flag = `{{${row.fieldFlag}}}`
let rs = oPar.Search(flag)
for (let i = 0; i < rs.length; i++) {
let oRange = rs[i]
if (oRange && oRange.GetText() === flag) {
if (dataMap[row.id]) {
dataMap[row.id] = dataMap[row.id] + 1
} else {
dataMap[row.id] = 1
}
}
}
})
} else if (ctype === 'paragraph') {
let oParText = oPar.GetText()
list.forEach(row => {
let count = oParText.split(`{{${row.fieldFlag}}}`).length - 1
if (dataMap[row.id]) {
dataMap[row.id] = dataMap[row.id] + count
} else {
dataMap[row.id] = count
}
})
}
}
let params = {
type: 'onExternalFrameMessage',
method: 'loadFieldFlagCount',
data: dataMap
}
window.top.postMessage(JSON.stringify(params), location.origin)
})
},
/**
* data.sheetName: 要聚焦的sheet名称
* data.cellName: 要聚焦的cell名称,如C1, D3等
*/
focusCell (data) {
window.Asc.scope.data = data
window.Asc.plugin.callCommand(function () {
const theData = Asc.scope.data
const theSheet = Api.GetSheet(theData.sheetName || '')
if (theSheet) {
theSheet.SetActive()
const theCell = theSheet.GetRange(theData.cellName || '')
if (theCell) {
theCell.Select()
}
}
})
},
getSelectedText (data) {
window.Asc.scope.data = data
window.Asc.plugin.callCommand(function () {
const theData = Asc.scope.data
const oDoc = Api.GetDocument()
const oRange = oDoc.GetRangeBySelect()
if (oRange) {
const oParas = oRange.GetAllParagraphs()
// 只能选择一个段落,否则认为不成功
if (oParas.length === 1) {
const params = {
type: 'onExternalFrameMessage',
method: 'getSelectedText',
data: {
id: theData.id,
text: oRange.GetText()
}
}
window.top.postMessage(JSON.stringify(params), location.origin)
}
}
})
}
}
function receiveMessage (e) {
let data = e.data ? JSON.parse(e.data) : {}
if (data.type === 'onExternalPluginMessage') {
switch (data.method) {
case 'focus':
EventMap.focusInDocument(data.data)
break
case 'focusTable':
EventMap.focusTableInDoc(data.data)
break
case 'insert':
EventMap.addMarker(data.data)
break
case 'addBookMarker':
EventMap.addBookMarker(data.data)
break
case 'delBookMarker':
EventMap.deleteBookMarker(data.data)
break
case 'delLoopApp':
EventMap.deleteLoopApp(data.data)
break
case 'update':
EventMap.replaceMarker(data.data)
break
case 'findAndInsertMarker':
EventMap.findAndInsertMarker(data.data)
break
case 'addRange':
EventMap.insertPosition(data.data)
break
case 'updateRange':
EventMap.replaceRangePosition(data.data)
break
case 'delRange':
EventMap.deletePosition(data.data)
break
case 'delRangeArray':
EventMap.deletePositionArray(data.data)
break
case 'delQuoteGroup':
EventMap.deletePositionMarker(data.data)
break
case 'remove':
EventMap.delMarker([ data.data ])
break
case 'removeQuestion':
EventMap.delMarkerGroup(data.data)
break
// excel
case 'addCellName':
EventMap.insertCellName(data.data)
break
case 'loadFieldFlagCount':
EventMap.loadFileFlags(data.data)
break
// 聚焦到某个单元格
case 'focusCell':
EventMap.focusCell(data.data)
break
// 获取当前选中的单元格
case 'getFocusedCell':
EventMap.getFocusedCell()
break
// 获取当前选中的文字
case 'getSelectedText':
EventMap.getSelectedText(data.data)
break
}
}
}
window.addEventListener('message', receiveMessage, false)
})(window, undefined)