向word书签写入表格并给值

向书签中写入表格,再给表格写入值,书签中可能 有多条记录,我需要判断 是图片时写入图片,不是图片则写入文字,遇到问题是:当只有一条数据时,写入图片可以的,但当是多条时,写入图片和文字都不可以,我的图片确实存在。代码如下:

      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方法中添加您希望执行的代码。

希望这可以帮助到您!

【相关推荐】




如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^