محرر جداول البيانات - العمل مع الملفات

جدول المحتويات

الملفات المدعومة

يمكن لـ HTML5 Spreadsheet Editor فتح الملفات بالتنسيقات التالية:

  • Excel 1997-2003 XLS
  • Excel 2007-2013 XLSX
  • XLSM
  • XLSB
  • XLTX
  • SpreadsheetML
  • CVS
  • OpenDocument

افتح الملفات المحلية

لتحميل ملف من جهاز كمبيوتر محلي:

  1. التبديل إلىتبويب الملف على القمة.
  2. انقرافتح من الكمبيوتر لفتح مربع الحوار “استعراض”.
  3. انتقل إلى موقع الملف المطلوب.
  4. انقر فوق الملف المطلوب لتحديده.
  5. انقرفتح.

سيتم فتح الملف في المحرر.

ما يجب القيام به: image_بديل_نص

كيف تعمل؟

تحميل الملف

يقوم المستخدم بتحديد ملف من جهاز كمبيوتر محلي يتم تحميله من متصفح الويب إلى الخادم واستلامه بواسطةملف PrimeFaces عنصر.

 <p:fileUpload fileUploadListener="#\{workbook.onFileUpload\}" update=":ribbon :intro :sheet" />

إدارة المصنف

بمجرد تحميل الملف بالكامل ، تدخل طريقة WorkbookService.onFileUpload للتعامل مع الموقف. تتلقى WorkbookService الأحداث من مستعرض الويب وتتابع حالة المصنف بالكامل. WorkbookService.onFileUpload تمرير عنصر التحكم إلى LoaderService لتحميل المصنف في الذاكرة. مثلتحميل الملف يوفر المكون الملف الذي تم تحميله كملفتيار الإدخال، تقوم LoaderService بتحميله باستخدام طريقة LoaderService.fromInputStream.

 public void onFileUpload(FileUploadEvent e) {

    this.current = loader.fromInputStream(e.getFile().getInputstream(), e.getFile().getFileName());

}

التحميل والتفريغ

طريقةLoaderService.fromInputStream يقرأتيار الإدخال مقدمة من fileUploadعنصر إنشاء مثيلcom.aspose.cells.Workbookصف دراسي. يتم الاحتفاظ بهذا المثيل في الذاكرة طالما استمر المستخدم في عرض جدول البيانات أو تحريره في متصفح الويب. عندما يترك المستخدم المحرر أو يغلق المتصفح ، يتم إلغاء تحميل المثيلات غير المستخدمة تلقائيًا من الذاكرة للحفاظ على الخادم نظيفًا.

 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;

}

التخزين المؤقت

التخزين المؤقت مهم جدًا لمحرر جداول بيانات HTML5. يجعل كل شيء يعمل بسلاسة. تحتفظ CellsService بصفوف وأعمدة وخلايا وخصائص ذاكرة التخزين المؤقت لجميع المصنفات التي تم تحميلها بواسطة المحرر. عندما يقوم LoaderService بتحميل جدول بيانات بالكامل ، فإنه يقرأه من أعلى إلى أسفل ويملأ ذاكرة التخزين المؤقت عن طريق استدعاء 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);

    }

افتح من Dropbox

لفتح الملفات من Dropbox:

  1. التبديل إلىتبويب الملف على القمة.
  2. انقرافتح من Dropbox لفتح منتقي ملف Dropbox.
  3. إذا لم تكن قد سجلت الدخول بالفعل ، فسيتطلب منك تسجيل الدخول إلى حساب Dropbox الخاص بك.
  4. انتقل إلى الملف المطلوب وانقر لتحديده.
  5. انقرأختر في الأسفل.

سيتم فتح الملف الذي اخترته من Dropbox.

ما يجب القيام به: image_بديل_نص

كيف تعمل؟

الافتح من Dropbox يستخدم زرمنتقي جافا سكريبت دروب بوكس API لفتح مربع حوار منتقي Dropbox. يوفر المنتقي عنوان URL للملف المحدد ، والذي يتم التقاطه بواسطة وظيفة رد الاتصال وإرساله مرة أخرى إلى الخادم. يقوم الخادم بإنشاء مثيل لجدول بيانات من عنوان URL ، وتهيئة بعض عناصر التدبير المنزلي ، وإرسال تحديثات DOM مرة أخرى إلى المتصفح. يقوم المستعرض بعرض وتحديث HTML ويكون المستخدم جاهزًا لتحرير المستند الذي تم تحميله.

افتح من URL

يمكن فتح الملفات مباشرة من عناوين المواقع. هذا يسمح للمستخدم بتحرير أي ملف متاح للجمهور على الإنترنت. لفتح ملف الإلحاق**؟ url = الموقع** المعلمة مع القيمة التي تريدها**موقعك** أثناء تحميل المحرر. على سبيل المثال:

 http://editor.aspose.com/?url=http://example.com/Sample.xlsx

ما يجب القيام به: image_بديل_نص

كيف تعمل؟

إنشاء مثيل أثناء بدء التشغيل

متيWorksheetView يتم إنشاء مثيل فول الواجهة الخلفية بواسطة JSF thePostConstruct طريقةفيه يسمى الذي يقوم بتحميل جدول البيانات باستخدام LoaderService.fromUrl.

التخزين المؤقت

يحدث التخزين المؤقت مباشرة بعد تحميل جدول البيانات. الخدمة لودر المكالماتLoaderService.buildCellsCache, LoaderService.buildColumnWidthCache وLoaderService.buildRowHeightCache واحدًا تلو الآخر لتخزين محتوى جدول البيانات مؤقتًا والحفاظ على سرعة وسلاسة جميع العمليات.

تحديثات DOM

عندما يكون جدول البيانات جاهزًا على جانب الخادم ، يتم استخدام مكونات JSF لإنشاء HTML جديد وإرسال تحديثات DOM إلى المستخدم والتي يتم تقديمها بواسطة متصفح الويب.

     @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);

    }

قم بإنشاء جدول بيانات جديد

لإنشاء جدول بيانات فارغ جديد:

  1. التبديل إلىتبويب الملف.
  2. انقر علىجديد زر.

سيغلق المحرر جدول البيانات المفتوح ، إن وجد ، وسيفتح جدولًا جديدًا.

ما يجب القيام به: image_بديل_نص

كيف تعمل؟

إنشاء كائن جديد

عندماجديد تم النقر فوق الزر من قبل المستخدم ،WorksheetView.loadBlank ، والذي يستدعي في النهايةLoaderService.fromBlank. يقوم LoaderService بإنشاء مثيل جديد لجدول بيانات فارغ.

التخزين المؤقت

يحدث التخزين المؤقت مباشرة بعد تحميل جدول البيانات. الخدمة لودر المكالماتLoaderService.buildCellsCache, LoaderService.buildColumnWidthCache وLoaderService.buildRowHeightCache واحدًا تلو الآخر لتخزين محتوى جدول البيانات مؤقتًا والحفاظ على سرعة وسلاسة جميع العمليات.

تحديثات DOM

عندما يكون جدول البيانات جاهزًا على جانب الخادم ، يتم استخدام مكونات JSF لإنشاء HTML جديد وإرسال تحديثات DOM إلى المستخدم والتي يتم تقديمها بواسطة متصفح الويب.

     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);

    }

تصدير إلى تنسيقات مختلفة

بعد تحرير الملفات ، سيرغب المستخدم في حفظ التغييرات. يسمح المحرر للمستخدم بتصدير وتنزيل جدول البيانات المعدل إلى الكمبيوتر المحلي. لتصدير الملف:

  1. التبديل إلىتبويب الملف على القمة.
  2. انقريصدّر كزر.
  3. اختر التنسيق الذي تريده من القائمة المنسدلة.

سيتم تصدير الملف المعدل للتحميل. التنسيقات التالية مدعومة للتصدير:

  • Excel 2007-2013 XLSX
  • Excel 1997-2003 XLS
  • Excel XLSM
  • Excel XLSB
  • Excel XLTX
  • Excel XLTM
  • SpreadsheetML
  • تنسيق المستندات المحمولة (PDF)
  • جدول بيانات OpenDocument (ODS)

كيف تعمل؟

يتم تحويل جدول البيانات المفتوح إلى تنسيق محدد بواسطة المستخدم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);

    }