public void writeDemandsAndSplitRatiosToSpreadSheet(String outFilename) throws BiffException, IOException, RowsExceededException, WriteException, IndexOutOfBoundsException { Workbook existingWorkbook = Workbook.getWorkbook(new File(outFilename)); WritableWorkbook workbookCopy = Workbook.createWorkbook(new File("Aimsun\\output.xls"), existingWorkbook); // add labels first row workbookCopy.getSheet(0).addCell(new Label(15, 0, "Split Ratios")); workbookCopy.getSheet(0).addCell(new Label(16, 0, "Offramp Flows")); workbookCopy.getSheet(0).addCell(new Label(17, 0, "Demands")); workbookCopy.getSheet(0).addCell(new Label(18, 0, "Flows")); workbookCopy.getSheet(0).addCell(new Label(19, 0, "Speeds")); int rowIndex = 1; for (Cell c : splitCells) { // find row index while (true) { NumberCell nc2 = (NumberCell) workbookCopy.getSheet(0).getCell(0, rowIndex); if (nc2.getValue() == c.getDetectorML().getSensorID()) { break; } rowIndex++; } // fill in mainline data columns for (int k = rowIndex; k < rowIndex + totalTimeInHours * 60 / 5; k++) { workbookCopy.getSheet(0).addCell(new Number(18, k, c.getFlowCompare().get(k - rowIndex))); workbookCopy.getSheet(0).addCell(new Number(19, k, c.getVelocity().get(k - rowIndex))); } rowIndex = 1; // if the cell has onramp, find the detector id and fill corresponding columns (assumption: // cells have at most one on-ramp or off-ramp) int onrampLinkID = 0; if (c.getLinks().getFirst().getUpLinks().size() > 1) { // By our assumption (above), there are at most 2 upstream links for each mainline link onrampLinkID = c.getLinks().getFirst().getUpLinks().get(0); for (Link mlLink : mainlineLinks) { if (mlLink.getLinkID() == onrampLinkID) { onrampLinkID = c.getLinks().getFirst().getUpLinks().get(1); break; } } // find associated detector int onrampDetId = 0; for (int key : detectors.keySet()) { if (detectors.get(key).getLinkAssoc() == onrampLinkID) { onrampDetId = detectors.get(key).getSensorID(); } } if (onrampDetId == 0) continue; // find row index while (true) { NumberCell nc2 = (NumberCell) workbookCopy.getSheet(0).getCell(0, rowIndex); if (nc2.getValue() == onrampDetId) { break; } rowIndex++; } for (int k = rowIndex; k < rowIndex + totalTimeInHours * 60 / 5; k++) { workbookCopy.getSheet(0).addCell(new Number(17, k, c.getOnRampInput().get(k - rowIndex))); workbookCopy.getSheet(0).addCell(new Number(18, k, c.getOnRampInput().get(k - rowIndex))); } rowIndex = 1; } // if the cell has offramp, find the detector id and fill corresponding columns (assumption: // cells have at most one on-ramp or off-ramp) int offrampLinkID = 0; if (c.getLinks().getLast().getDownLinks().size() > 1) { // By our assumption (above), there are at most 2 upstream links for each mainline link offrampLinkID = c.getLinks().getLast().getDownLinks().get(0); for (Link mlLink : mainlineLinks) { if (mlLink.getLinkID() == offrampLinkID) { offrampLinkID = c.getLinks().getLast().getDownLinks().get(1); break; } } // find associated detector int offrampDetId = 0; for (int key : detectors.keySet()) { if (detectors.get(key).getLinkAssoc() == offrampLinkID) { offrampDetId = detectors.get(key).getSensorID(); } } if (offrampDetId == 0) continue; // find row index while (true) { NumberCell nc2 = (NumberCell) workbookCopy.getSheet(0).getCell(0, rowIndex); if (nc2.getValue() == offrampDetId) { break; } rowIndex++; } for (int k = rowIndex; k < rowIndex + totalTimeInHours * 60 / 5; k++) { workbookCopy.getSheet(0).addCell(new Number(15, k, c.getBeta().get(k - rowIndex))); workbookCopy.getSheet(0).addCell(new Number(16, k, c.getOffRampFlow().get(k - rowIndex))); workbookCopy.getSheet(0).addCell(new Number(18, k, c.getOffRampFlow().get(k - rowIndex))); } rowIndex = 1; } // rowIndex += totalTimeInHours*60/5; rowIndex = 1; } workbookCopy.write(); workbookCopy.close(); existingWorkbook.close(); }