insert a row in to a google spreadsheet using the API with java

陌路散爱 提交于 2019-12-12 01:23:59

问题


I have a google spreadsheet with 20 rows in. How do I insert a new row below row 10.

I can delete a row with:

            URL listFeedUrl = worksheet.getListFeedUrl();
            ListFeed listFeed = service.getFeed(listFeedUrl, ListFeed.class);

            ListEntry row = listFeed.getEntries().get(10);
            row.delete();

I can add a row to the end by re-sizing the worksheet. See here: https://developers.google.com/google-apps/spreadsheets/#modifying_a_worksheets_title_and_size

I want an example of how to insert a row in the middle of a sheet.


回答1:


There is no "Insert" in the API. The solution was to manually move rows down to create a gap. This does not move "Styles" such as bold. And some "Valid" cell references cause errors when moving down and need to be changed to absolute references.

Code

Updates references after an insert row, or delete row. This was the most complex bit. There is more, but is not easy to split out.

    /**
     * @param locationRow
     */
    private void updateSheetReferences(int locationRow, boolean insertingNewRow) {
        System.out.printf("\n%s ms elapsed updateSheetReferences \n", System.currentTimeMillis() - startTime);
        Pattern cellRefPattern = Pattern.compile("R(\\[?)([-0-9]+)\\]?C(\\[?)([-0-9]*)\\]?");
          int incDirection = 1;
          if (insertingNewRow == false)  incDirection = -1;
          for(AppCell nextCell : activeWorksheetCells.getAllCells()) {
              int row = nextCell.row;
              int col = nextCell.col;
              String cellInputValue = nextCell.inputValue;
              if (cellInputValue == null) continue;


              // create a copy of the cell to replace
              String updateReference = cellInputValue; 

              if(updateReference.startsWith("=")) {
                  String removeReferenceBug = updateReference.replace( (CharSequence) "C:R", (CharSequence) "C[0]:R");


                  Matcher referenceMatcher = cellRefPattern.matcher(removeReferenceBug);
                  StringBuffer restultBuffer = new StringBuffer();
                  while (referenceMatcher.find()) {
                      try {
                          if(referenceMatcher.group(1).equals("[")) {
                              int rowOffset = Integer.parseInt(referenceMatcher.group(2));
                              int topRowOfSpan;
                              int bottomRowOfSpan;                                
                              int incSize = 1*incDirection;
                              // the location of the deleted row is relative, and so one row lower if row was deleted
                              int locationDeletedOffset = 0;
                              if(row >= locationRow && insertingNewRow == false) locationDeletedOffset = -1; 

                              // get the top and bottom rows of the 
                              if(rowOffset > 0) {
                                  topRowOfSpan = row;
                                  bottomRowOfSpan = row + rowOffset;
                              } else {
                                  topRowOfSpan = row + rowOffset;
                                  bottomRowOfSpan = row ;       
                                  incSize = -1*incDirection;
                              }                               
                              //System.out.println("move down: reference:"+cellAddr.reference+" topRowOfSpan:"+topRowOfSpan+
                              //      " insertLocationRow:"+insertLocationRow+" bottomRowOfSpan:"+bottomRowOfSpan);
                              // IF reference is the deleted row 
                              if(insertingNewRow == false && row + rowOffset == locationRow+locationDeletedOffset) {
                                  referenceMatcher.appendReplacement(restultBuffer, "{}");                                                                                                                    
                              } else {
                                  if(topRowOfSpan <= locationRow+locationDeletedOffset && bottomRowOfSpan >= locationRow+locationDeletedOffset) rowOffset += incSize;
                                  if(referenceMatcher.group(3).equals("[")) {
                                      referenceMatcher.appendReplacement(restultBuffer, "R["+rowOffset+"]C["+referenceMatcher.group(4)+"]");                                      

                                  } else {
                                      int colOffset = 0;                                          
                                      String colText = referenceMatcher.group(4);                                         
                                      if(colText != null && "".equals(colText) == false) {
                                          colOffset = Integer.parseInt(colText) - col;
                                      }                                       
                                      referenceMatcher.appendReplacement(restultBuffer, "R["+rowOffset+"]C["+colOffset+"]");                                                                              
                                  }                                   
                              }
                          } else {
                              int absoluteRow = Integer.parseInt(referenceMatcher.group(2));
                              // IF reference is the deleted row
                              if(insertingNewRow == false && absoluteRow == locationRow) {
                                  referenceMatcher.appendReplacement(restultBuffer, "{}");                                                                                                                    
                              } else {
                                  if(absoluteRow >= locationRow ) absoluteRow += 1 * incDirection;
                                  if(referenceMatcher.group(3).equals("[")) {
                                      referenceMatcher.appendReplacement(restultBuffer, "R"+absoluteRow+"C["+referenceMatcher.group(4)+"]");                                                                                                              
                                  } else {
                                      referenceMatcher.appendReplacement(restultBuffer, "R"+absoluteRow+"C"+referenceMatcher.group(4));                                                                                                                                                   
                                  }
                              }

                          }
                      } catch(NumberFormatException nfe) {}
                  } // END while
                  referenceMatcher.appendTail(restultBuffer);
                  updateReference = restultBuffer.toString();                                                                         

              } // END IF

              nextCell.inputValue =  updateReference;
          }
    }


来源:https://stackoverflow.com/questions/14209079/insert-a-row-in-to-a-google-spreadsheet-using-the-api-with-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!