Kalkylbladsredigerare Arbeta med filer
Innehållsförteckning
- Understödda filer
- Öppna Lokala Filer
- LoaderService.buildColumnWidthCache
- LoaderService.buildRowHeightCache
- Öppna från Dropbox
- Öppna från URL
- LoaderService.fromUrl
- LoaderService.buildCellsCache
- LoaderService.buildColumnWidthCache
- LoaderService.buildRowHeightCache
- Skapa en ny kalkylblad
- LoaderService.fromBlank
- buildCellsCache
- buildColumnWidthCache
- buildRowHeightCache
- Exportera till olika format
Understödda filer
HTML5 Kalkylbladsredigerare kan öppna filer i följande format:
- Excel 1997-2003 XLS
- Excel 2007-2013 XLSX
- XLSM
- XLSB
- XLTX
- SpreadsheetML
- CVS
- OpenDocument
Öppna Lokala Filer
För att ladda upp en fil från lokal dator:
- Byt till fliken Arkiv högst upp.
- Klicka på Öppna från datorn för att öppna dialogrutan Bläddra.
- Gå till den önskade filens plats.
- Klicka på den önskade filen för att välja den.
- Klicka på Öppna.
Filen öppnas i redigeraren.
Hur fungerar det?
Filuppladdning
Användaren väljer en fil från den lokala datorn som laddas upp från webbläsaren till servern och tas emot av PrimeFaces fileUpload komponent.
<p:fileUpload fileUploadListener="#\{workbook.onFileUpload\}" update=":ribbon :intro :sheet" />
Hantera arbetsbok
Så snart filen är helt uppladdad, träder WorkbookService.onFileUpload-metoden i kraft för att hantera situationen. WorkbookService tar emot händelser från webbläsaren och håller koll på hela arbetsbokens status. WorkbookService.onFileUpload skickar kontrollen vidare till LoaderService för att ladda arbetsboken i minnet. Eftersom fileUpload-komponenten tillhandahåller den uppladdade filen som en InputStream, laddar LoaderService in den med hjälp av LoaderService.fromInputStream-metoden.
public void onFileUpload(FileUploadEvent e) {
this.current = loader.fromInputStream(e.getFile().getInputstream(), e.getFile().getFileName());
}
Laddning och lossning
Metoden LoaderService.fromInputStream läser InputStream som tillhandahålls av fileUpload komponenten och skapar en instans av klassen com.aspose.cells.Workbook. Denna instans hålls i minnet så länge användaren fortsätter att visa eller redigera kalkylarket i webbläsaren. När användaren lämnar redigeraren eller stänger webbläsaren läses de oanvända instanserna automatiskt ut från minnet för att hålla servern ren.
public String fromInputStream(InputStream s, String name) {
com.aspose.cells.Workbook w;
try (InputStream i = s) {
w = new com.aspose.cells.Workbook(i);
} catch (Exception x) {
return null;
}
String key = this.generateKey();
this.workbooks.put(key, w);
this.buildCellsCache(key);
this.buildColumnWidthCache(key);
this.buildRowHeightCache(key);
return key;
}
Cachning
Cachning är väldigt viktigt för HTML5 Kalkylbladsredigeraren. Det får allting att fungera smidigt. CellsService behåller cache-rader, kolumner, celler och egenskaper för alla arbetsböcker som laddats av redigeraren. När LoaderService laddar ett kalkylblad helt, läser den igenom det från början till slut och fyller upp cachen genom att anropa LoaderService.buildCellsCache, LoaderService.buildColumnWidthCache, LoaderService.buildRowHeightCache
public void buildCellsCache(String key) {
com.aspose.cells.Workbook wb = workbooks.get(key);
com.aspose.cells.Worksheet ws = wb.getWorksheets().get(wb.getWorksheets().getActiveSheetIndex());
int maxColumn = ws.getCells().getMaxColumn() + 1;
maxColumn = maxColumn + 26 - (maxColumn % 26);
int maxRow = 20 + ws.getCells().getMaxRow() + 1;
maxRow = maxRow + 10 - (maxRow % 10);
ArrayList<Column> columns = new ArrayList<>(maxColumn);
ArrayList<Row> rows = new ArrayList<>(maxRow);
for (int i = 0; i < maxColumn; i++) {
columns.add(i, new Column(i, com.aspose.cells.CellsHelper.columnIndexToName(i)));
}
for (int i = 0; i < maxRow; i++) {
rows.add(i, new Row.Builder().setId(i).build());
}
for (Object o : ws.getCells()) {
com.aspose.cells.Cell c = (com.aspose.cells.Cell) o;
rows.get(c.getRow()).putCell(c.getColumn(), cells.fromAsposeCell(c));
}
for (int i = 0; i < maxRow; i++) {
for (int j = 0; j < maxColumn; j++) {
String col = com.aspose.cells.CellsHelper.columnIndexToName(j);
if (!rows.get(i).getCellsMap().containsKey(col)) {
rows.get(i).putCell(col, cells.fromBlank(j, i));
}
}
}
cells.putColumns(key, columns);
cells.putRows(key, rows);
}
LoaderService.buildColumnWidthCache
public void buildColumnWidthCache(String key) {
com.aspose.cells.Workbook wb = workbooks.get(key);
com.aspose.cells.Worksheet ws = wb.getWorksheets().get(wb.getWorksheets().getActiveSheetIndex());
ArrayList<Integer> columnWidth = new ArrayList<>();
for (int i = 0; i < cells.getColumns(key).size(); i++) {
columnWidth.add(i, ws.getCells().getColumnWidthPixel(i));
}
cells.putColumnWidth(key, columnWidth);
}
LoaderService.buildRowHeightCache
public void buildRowHeightCache(String key) {
com.aspose.cells.Workbook wb = workbooks.get(key);
com.aspose.cells.Worksheet ws = wb.getWorksheets().get(wb.getWorksheets().getActiveSheetIndex());
ArrayList<Integer> rowHeight = new ArrayList<>();
for (int i = 0; i < cells.getRows(key).size(); i++) {
rowHeight.add(i, ws.getCells().getRowHeightPixel(i));
}
cells.putRowHeight(key, rowHeight);
}
Öppna från Dropbox
För att öppna filer från Dropbox:
- Byt till fliken Arkiv högst upp.
- Klicka på Öppna från Dropbox för att öppna Dropbox-filväljaren.
- Om du inte redan är inloggad kommer du att behöva logga in på ditt Dropbox-konto.
- Navigera till önskad fil och klicka för att välja den.
- Klicka på Välj längst ned.
Din valda fil öppnas från Dropbox.
Hur fungerar det?
Knappen Öppna från Dropbox använder Dropbox JavaScript Chooser API för att öppna Dropbox väljardialogen. Väljaren tillhandahåller URL till vald fil, som fångas av callback-funktionen och skickas tillbaka till servern. Servern skapar en instans av kalkylblad från URL, initierar vissa administrationssaker och skickar tillbaka DOM-uppdateringar till webbläsaren. Webbläsaren renderar och uppdaterar HTML och användaren är redo att redigera det inlästa dokumentet.
Öppna från URL
Filer kan öppnas direkt från webbadresser. Detta gör att användaren kan redigera vilken offentligt tillgänglig fil som helst på internet. För att öppna filen lägger du till parameteren ?url=plats med värdet av din önskade plats vid inladdningen av redigeraren. Till exempel:
http://editor.aspose.com/?url=http://example.com/Sample.xlsx
Hur fungerar det?
Instantiate vid start
När WorksheetView backend-beanen instantieras av JSF, anropas metoden init av PostConstruct vilket laddar kalkylarket med hjälp av LoaderService.fromUrl.
Cachning
Cachning sker direkt efter att kalkylbladet har laddats. LoaderService anropar LoaderService.buildCellsCache, LoaderService.buildColumnWidthCache och LoaderService.buildRowHeightCache var för sig för att cacha innehållet i kalkylbladet och hålla alla operationer snabba och smidiga.
DOM-uppdateringar
När kalkylbladet är redo på serverns sida används JSF-komponenter för att generera ny HTML och skicka DOM-uppdateringar till användaren, vilka renderas av webbläsaren.
@PostConstruct
private void init() {
String requestedSourceUrl = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("url");
if (requestedSourceUrl != null) {
try {
this.sourceUrl = new URL(requestedSourceUrl).toString();
this.loadFromUrl();
} catch (MalformedURLException x) {
msg.sendMessageDialog("The specified URL is invalid", requestedSourceUrl);
}
}
}
LoaderService.fromUrl
public String fromUrl(String url) {
com.aspose.cells.Workbook w;
try (InputStream i = new URL(url).openStream()) {
w = new com.aspose.cells.Workbook(i);
} catch (Exception x) {
throw new RuntimeException(x);
}
String key = generateKey();
workbooks.put(key, w);
buildCellsCache(key);
buildColumnWidthCache(key);
buildRowHeightCache(key);
return key;
}
LoaderService.buildCellsCache
public void buildCellsCache(String key) {
com.aspose.cells.Workbook wb = workbooks.get(key);
com.aspose.cells.Worksheet ws = wb.getWorksheets().get(wb.getWorksheets().getActiveSheetIndex());
int maxColumn = ws.getCells().getMaxColumn() + 1;
maxColumn = maxColumn + 26 - (maxColumn % 26);
int maxRow = 20 + ws.getCells().getMaxRow() + 1;
maxRow = maxRow + 10 - (maxRow % 10);
ArrayList<Column> columns = new ArrayList<>(maxColumn);
ArrayList<Row> rows = new ArrayList<>(maxRow);
for (int i = 0; i < maxColumn; i++) {
columns.add(i, new Column(i, com.aspose.cells.CellsHelper.columnIndexToName(i)));
}
for (int i = 0; i < maxRow; i++) {
rows.add(i, new Row.Builder().setId(i).build());
}
for (Object o : ws.getCells()) {
com.aspose.cells.Cell c = (com.aspose.cells.Cell) o;
rows.get(c.getRow()).putCell(c.getColumn(), cells.fromAsposeCell(c));
}
for (int i = 0; i < maxRow; i++) {
for (int j = 0; j < maxColumn; j++) {
String col = com.aspose.cells.CellsHelper.columnIndexToName(j);
if (!rows.get(i).getCellsMap().containsKey(col)) {
rows.get(i).putCell(col, cells.fromBlank(j, i));
}
}
}
cells.putColumns(key, columns);
cells.putRows(key, rows);
}
LoaderService.buildColumnWidthCache
public void buildColumnWidthCache(String key) {
com.aspose.cells.Workbook wb = workbooks.get(key);
com.aspose.cells.Worksheet ws = wb.getWorksheets().get(wb.getWorksheets().getActiveSheetIndex());
ArrayList<Integer> columnWidth = new ArrayList<>();
for (int i = 0; i < cells.getColumns(key).size(); i++) {
columnWidth.add(i, ws.getCells().getColumnWidthPixel(i));
}
cells.putColumnWidth(key, columnWidth);
}
LoaderService.buildRowHeightCache
public void buildRowHeightCache(String key) {
com.aspose.cells.Workbook wb = workbooks.get(key);
com.aspose.cells.Worksheet ws = wb.getWorksheets().get(wb.getWorksheets().getActiveSheetIndex());
ArrayList<Integer> rowHeight = new ArrayList<>();
for (int i = 0; i < cells.getRows(key).size(); i++) {
rowHeight.add(i, ws.getCells().getRowHeightPixel(i));
}
cells.putRowHeight(key, rowHeight);
}
Skapa en ny kalkylblad
För att skapa ett nytt tomt kalkylblad:
- Byt till fliken Arkiv.
- Klicka på Ny-knappen.
Redigeraren stänger det öppnade kalkylbladet, om något, och öppnar ett nytt.
Hur fungerar det?
Instansiera ett nytt objekt
När användaren klickar på Ny-knappen, WorksheetView.loadBlank aktiveras, vilket slutligen anropar LoaderService.fromBlank. LoaderService skapar en ny instans av tomt kalkylblad.
Cachning
Cachning sker direkt efter att kalkylbladet har laddats. LoaderService anropar LoaderService.buildCellsCache, LoaderService.buildColumnWidthCache och LoaderService.buildRowHeightCache var för sig för att cacha innehållet i kalkylbladet och hålla alla operationer snabba och smidiga.
DOM-uppdateringar
När kalkylbladet är redo på serverns sida används JSF-komponenter för att generera ny HTML och skicka DOM-uppdateringar till användaren, vilka renderas av webbläsaren.
public void loadBlank() {
this.loadedWorkbook = loader.fromBlank();
}
LoaderService.fromBlank
public String fromBlank() {
com.aspose.cells.Workbook w = new com.aspose.cells.Workbook();
String key = generateKey();
workbooks.put(key, w);
buildCellsCache(key);
buildColumnWidthCache(key);
buildRowHeightCache(key);
return key;
}
buildCellsCache
public void buildCellsCache(String key) {
com.aspose.cells.Workbook wb = workbooks.get(key);
com.aspose.cells.Worksheet ws = wb.getWorksheets().get(wb.getWorksheets().getActiveSheetIndex());
int maxColumn = ws.getCells().getMaxColumn() + 1;
maxColumn = maxColumn + 26 - (maxColumn % 26);
int maxRow = 20 + ws.getCells().getMaxRow() + 1;
maxRow = maxRow + 10 - (maxRow % 10);
ArrayList<Column> columns = new ArrayList<>(maxColumn);
ArrayList<Row> rows = new ArrayList<>(maxRow);
for (int i = 0; i < maxColumn; i++) {
columns.add(i, new Column(i, com.aspose.cells.CellsHelper.columnIndexToName(i)));
}
for (int i = 0; i < maxRow; i++) {
rows.add(i, new Row.Builder().setId(i).build());
}
for (Object o : ws.getCells()) {
com.aspose.cells.Cell c = (com.aspose.cells.Cell) o;
rows.get(c.getRow()).putCell(c.getColumn(), cells.fromAsposeCell(c));
}
for (int i = 0; i < maxRow; i++) {
for (int j = 0; j < maxColumn; j++) {
String col = com.aspose.cells.CellsHelper.columnIndexToName(j);
if (!rows.get(i).getCellsMap().containsKey(col)) {
rows.get(i).putCell(col, cells.fromBlank(j, i));
}
}
}
cells.putColumns(key, columns);
cells.putRows(key, rows);
}
buildColumnWidthCache
public void buildColumnWidthCache(String key) {
com.aspose.cells.Workbook wb = workbooks.get(key);
com.aspose.cells.Worksheet ws = wb.getWorksheets().get(wb.getWorksheets().getActiveSheetIndex());
ArrayList<Integer> columnWidth = new ArrayList<>();
for (int i = 0; i < cells.getColumns(key).size(); i++) {
columnWidth.add(i, ws.getCells().getColumnWidthPixel(i));
}
cells.putColumnWidth(key, columnWidth);
}
buildRowHeightCache
public void buildRowHeightCache(String key) {
com.aspose.cells.Workbook wb = workbooks.get(key);
com.aspose.cells.Worksheet ws = wb.getWorksheets().get(wb.getWorksheets().getActiveSheetIndex());
ArrayList<Integer> rowHeight = new ArrayList<>();
for (int i = 0; i < cells.getRows(key).size(); i++) {
rowHeight.add(i, ws.getCells().getRowHeightPixel(i));
}
cells.putRowHeight(key, rowHeight);
}
Exportera till olika format
Efter att ha redigerat filer vill användaren spara ändringar. Redigeraren tillåter användaren att exportera och ladda ner det modifierade kalkylbladet till den lokala datorn. För att exportera filen:
- Byt till fliken Arkiv högst upp.
- Klicka på Exportera som-knappen.
- Välj önskat format från rullgardinsmenyn.
Den modifierade filen kommer att exporteras för nedladdning. Följande format stöds för export:
- Excel 2007-2013 XLSX
- Excel 1997-2003 XLS
- Excel XLSM
- Excel XLSB
- Excel XLTX
- Excel XLTM
- SpreadsheetML
- Bärbar dokumentformat (PDF)
- OpenDocument kalkylblad (ODS)
Hur fungerar det?
Det öppnade kalkylbladet konverteras till det användarspecificerade formatet med hjälp av WorksheetView.getOutputFile.
public StreamedContent getOutputFile(int saveFormat) {
byte[] buf;
String ext = null;
switch (saveFormat) {
case com.aspose.cells.SaveFormat.EXCEL_97_TO_2003:
ext = "xls";
break;
case com.aspose.cells.SaveFormat.XLSX:
ext = "xlsx";
break;
case com.aspose.cells.SaveFormat.XLSM:
ext = "xlsm";
break;
case com.aspose.cells.SaveFormat.XLSB:
ext = "xlsb";
break;
case com.aspose.cells.SaveFormat.XLTX:
ext = "xltx";
break;
case com.aspose.cells.SaveFormat.XLTM:
ext = "xltm";
break;
case com.aspose.cells.SaveFormat.SPREADSHEET_ML:
ext = "xml";
break;
case com.aspose.cells.SaveFormat.PDF:
ext = "pdf";
break;
case com.aspose.cells.SaveFormat.ODS:
ext = "ods";
break;
}
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
getAsposeWorkbook().save(out, saveFormat);
buf = out.toByteArray();
} catch (Exception x) {
throw new RuntimeException(x);
}
return new DefaultStreamedContent(new ByteArrayInputStream(buf), "application/octet-stream", "Spreadsheet." + ext);
}