向书签中写入表格,再给表格写入值,书签中可能 有多条记录,我需要判断 是图片时写入图片,不是图片则写入文字,遇到问题是:当只有一条数据时,写入图片可以的,但当是多条时,写入图片和文字都不可以,我的图片确实存在。代码如下:
var bookmarks = TANGER_OCX_OBJ.ActiveDocument.Bookmarks;
var bookmarkRange = bookmarks.Item("qfld").Range;
var table = bookmarkRange.Tables.Add(bookmarkRange, a*2, 2); // 4行1列的表格
table.Borders.Enable=false;
// 设置表格边框颜色与背景相同
table.Borders.Color = 0xFFFFFF; // 设置为白色或其他与背景相同的颜色
// 或者将表格边框宽度设置为非常细小的值
table.Borders.Weight = 0.1; // 设置为0.1或更小的值
// 如果以上方法仍然无法隐藏边框,可以尝试将边框样式设置为无边框样式
table.Borders.OutsideLineStyle = 0; // 设置为无边框样式
table.Borders.InsideLineStyle = 0; // 设置为无边框样式
for(var i=0;i<a;i++){
table.Cell(i+i+1,1).Range.Text =qfld[i].yj;
table.Cell(i+i+1,1).Width=190;
table.Cell(i+i+1,2).Width=2;
// table.Cell(i+i+1,1).Range.Merge(table.Cell(i+i+1,2).Range);
// table.Cell(i+i+2,1).Range.Text =qfld[i].spr;
table.Cell(i+i+2,1).Width=105;
table.Cell(i+i+2,2).Width=82;
table.Cell(i+i+2,2).Range.Text = qfld[i].sj;// 在第二列插入文本
table.Cell(i+i+2,1).Range.ParagraphFormat.Alignment=2;
table.Cell(i+i+2,2).Range.ParagraphFormat.Alignment=2;
// table.Cell(i+i+2,1).Height=20;
// 判断图片是否存在并插入
var qmimg="http://172.16.38.9:8080/static/resource/signer/"+qfld[i].spr+".jpeg";
var qfldspr=qfld[i].spr;
var img = new Image();
img.src = qmimg;
//判断 图片---------------------------------------------------------
checkFileExists(qmimg, function(exists) {
if (exists) {
console.log(qfldspr+'文件存在');
var sprCell = table.Cell(i+i+2,1);
sprCell.Range.InlineShapes.AddPicture(qmimg);
// sprCell.Width = 80; // 设置宽度为100
// sprCell.Height = 20; // 设置高度为100
} else {
console.log(qfldspr+'文件不存在');
table.Cell(i+i+2,1).Range.Text=qfldspr;
}
});
}
--------------------------调用的函数(用于判断图片是否存在)----------------------------------------------------------
function checkFileExists(url, callback) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
callback(true);
} else if(xhr.status==404){
callback(false);
}
}
};
xhr.open('HEAD', url);
xhr.send();
}
引用chatgpt内容作答:
你的代码基本上是正确的,但可能存在多行数据时插入图片的异步问题。下面我会指出可能存在问题的地方,并提供解决方案。
1、表格边框: 你已经将表格的边框设置为不可见,这是没有问题的,如果你想要一个无边框的表格。
2、表格创建和单元格填充: 使用循环为表格单元格填充值的逻辑是正确的,包括根据条件插入图像的逻辑。
3、图片加载和插入: 使用 checkFileExists 来确定图片是否存在然后再插入单元格是个不错的方法。
然而,问题可能与 XMLHttpRequest 的异步性有关。当处理多个图像时,checkFileExists 的回调函数可能会在循环完成后执行,导致出现意外行为。
为了解决这个问题,你可以修改代码,确保将文本和图像插入单元格的操作以同步的方式进行。以下是修改后的代码:
// 修改你的循环如下
for (var i = 0; i < a; i++) {
(function(index) {
var qmimg = "http://172.16.38.9:8080/static/resource/signer/" + qfld[index].spr + ".jpeg";
var qfldspr = qfld[index].spr;
checkFileExists(qmimg, function(exists) {
var sprCell = table.Cell(index + index + 2, 1);
if (exists) {
console.log(qfldspr + '文件存在');
sprCell.Range.InlineShapes.AddPicture(qmimg);
} else {
console.log(qfldspr + '文件不存在');
sprCell.Range.Text = qfldspr;
}
// 继续填充其他单元格
table.Cell(index + index + 2, 2).Range.Text = qfld[index].sj;
table.Cell(index + index + 2, 1).Width = 105;
table.Cell(index + index + 2, 2).Width = 82;
table.Cell(index + index + 2, 1).Range.ParagraphFormat.Alignment = 2;
table.Cell(index + index + 2, 2).Range.ParagraphFormat.Alignment = 2;
if (index === a - 1) {
// 这是最后一次迭代,可以在这里进行任何最终处理
}
});
})(i);
}
通过将循环迭代包装在立即调用的函数表达式(IIFE)中,并将循环变量 i 作为参数传递,你确保了异步的 checkFileExists 回调函数操作的是正确的索引值,避免了竞争条件。
checkFileExists 函数仍然是异步的,但现在它不会影响循环内的同步操作。
下个断点调试下,多条的时候你获取的单元格是否返回和单条的时候一样。
您使用了checkFileExists
函数来检查图片是否存在。但是,由于JavaScript是异步执行的,您需要在检查图片是否存在后再执行插入图片的操作。
可以尝试使用Promise来处理异步操作,以确保在检查图片是否存在后再执行插入图片的操作。以下是修改后的代码示例:
var bookmarks = TANGER_OCX_OBJ.ActiveDocument.Bookmarks;
var bookmarkRange = bookmarks.Item("qfld").Range;
var table = bookmarkRange.Tables.Add(bookmarkRange, a*2, 2); // 4行1列的表格
table.Borders.Enable = false;
table.Borders.Color = 0xFFFFFF; // 设置表格边框颜色与背景相同
table.Borders.Weight = 0.1; // 设置表格边框宽度为0.1或更小的值
table.Borders.OutsideLineStyle = 0; // 设置为无边框样式
table.Borders.InsideLineStyle = 0; // 设置为无边框样式
var promises = [];
for (var i = 0; i < a; i++) {
table.Cell(i + i + 1, 1).Range.Text = qfld[i].yj;
table.Cell(i + i + 1, 1).Width = 190;
table.Cell(i + i + 1, 2).Width = 2;
table.Cell(i + i + 2, 1).Width = 105;
table.Cell(i + i + 2, 2).Width = 82;
table.Cell(i + i + 2, 2).Range.Text = qfld[i].sj;
table.Cell(i + i + 2, 1).Range.ParagraphFormat.Alignment = 2;
table.Cell(i + i + 2, 2).Range.ParagraphFormat.Alignment = 2;
var qmimg = "http://172.16.38.9:8080/static/resource/signer/" + qfld[i].spr + ".jpeg";
var qfldspr = qfld[i].spr;
var promise = new Promise(function(resolve, reject) {
checkFileExists(qmimg, function(exists) {
if (exists) {
console.log(qfldspr + '文件存在');
var sprCell = table.Cell(i + i + 2, 1);
sprCell.Range.InlineShapes.AddPicture(qmimg);
} else {
console.log(qfldspr + '文件不存在');
table.Cell(i + i + 2, 1).Range.Text = qfldspr;
}
resolve();
});
});
promises.push(promise);
}
Promise.all(promises).then(function() {
// 所有图片插入完成后的操作
});
在上述代码中,我使用了Promise.all
来等待所有图片的插入操作完成后再执行后续操作。您可以在then
方法中添加您希望执行的代码。
希望这可以帮助到您!
【相关推荐】