LightCells'i Kullanma API
Olay Odaklı Mimari
Aspose.Cells, belleğe eksiksiz bir veri modeli bloğu oluşturmadan (Cell koleksiyonunu kullanarak vb.) temel olarak hücre verilerini tek tek işlemek için tasarlanmış LightCells API’i sağlar. Olay güdümlü modda çalışır.
Çalışma kitaplarını kaydetmek için, kaydederken hücre içeriğini hücre hücre sağlayın ve bileşen bunu doğrudan çıktı dosyasına kaydeder.
Şablon dosyalarını okurken, bileşen her hücreyi ayrıştırır ve değerlerini birer birer sağlar.
Her iki prosedürde de bir Cell nesnesi işlenir ve sonra atılır, Çalışma Kitabı nesnesi koleksiyonu tutmaz. Bu nedenle, bu modda, aksi takdirde çok fazla bellek kullanacak olan büyük bir veri kümesine sahip Microsoft Excel dosyasını içe ve dışa aktarırken bellek kaydedilir.
LightCells API, XLSX ve XLS dosyaları için hücreleri aynı şekilde işlese de (aslında hafızadaki tüm hücreleri yüklemez, bir hücreyi işler ve sonra onu atar), XLSX dosyaları için hafızayı XLS dosyalarına göre daha etkili bir şekilde kaydeder. iki biçimin farklı veri modelleri ve yapıları.
Yine de,XLS dosyaları için , daha fazla bellek kazanmak için geliştiriciler, Kaydetme işlemi sırasında oluşturulan geçici verileri kaydetmek için geçici bir konum belirtebilir. yaygın olarak,XLSX dosyasını kaydetmek için LightCells API kullanmak %50 veya daha fazla bellek tasarrufu sağlayabilir ortak yolu kullanmaktansa,XLS’i kaydetmek, yaklaşık %20-40 bellek tasarrufu sağlayabilir.
Büyük Excel Dosyaları Yazma
Aspose.Cells, programınızda uygulanması gereken LightCellsDataProvider adlı bir arabirim sağlar. Arayüz, büyük elektronik tablo dosyalarını hafif modda kaydetmek için Veri sağlayıcıyı temsil eder.
Bir çalışma kitabını bu modda kaydederken, çalışma kitabındaki her çalışma sayfasını kaydederken startSheet(int) kontrol edilir. Bir sayfa için, startSheet(int) true ise, bu sayfanın satırlarının ve hücrelerinin tüm verilerinin ve özelliklerinin kaydedilmesi bu uygulama tarafından sağlanır. İlk olarak, kaydedilecek bir sonraki satır indeksini almak için nextRow() çağrılır. Geçerli bir satır dizini döndürülürse (satırların kaydedilmesi için satır dizini artan düzende olmalıdır), bu durumda, startRow(Row) ile özelliklerini ayarlamak üzere uygulama için bu satırı temsil eden bir Row nesnesi sağlanır.
Bir satır için önce nextCell() kontrol edilir. Geçerli bir sütun dizini döndürülürse (bir satırdaki tüm hücrelerin kaydedilmesi için sütun dizini artan düzende olmalıdır), bu durumda verileri ve özellikleri startCell(Cell) ile ayarlamak için bu hücreyi temsil eden bir Cell nesnesi sağlanır. Bu hücrenin verileri ayarlandıktan sonra, bu hücre doğrudan oluşturulan elektronik tablo dosyasına kaydedilir ve bir sonraki hücre kontrol edilerek işlenir.
Aşağıdaki örnek, LightCells API’in nasıl çalıştığını gösterir.
Aşağıdaki program, verilerle dolu bir çalışma sayfasında 100.000 kayıt içeren devasa bir dosya oluşturur. Çalışma sayfasındaki belirli hücrelere bazı köprüler, dize değerleri, sayısal değerler ve ayrıca formüller ekledik. Ayrıca, bir dizi hücreyi de biçimlendirdik.
// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-Java | |
public class LightCellsDataProviderDemo implements LightCellsDataProvider { | |
private final int sheetCount; | |
private final int maxRowIndex; | |
private final int maxColIndex; | |
private int rowIndex; | |
private int colIndex; | |
private final Style style1; | |
private final Style style2; | |
public LightCellsDataProviderDemo(Workbook wb, int sheetCount, int rowCount, int colCount) { | |
// set the variables/objects | |
this.sheetCount = sheetCount; | |
this.maxRowIndex = rowCount - 1; | |
this.maxColIndex = colCount - 1; | |
// add new style object with specific formattings | |
style1 = wb.createStyle(); | |
Font font = style1.getFont(); | |
font.setName("MS Sans Serif"); | |
font.setSize(10); | |
font.setBold(true); | |
font.setItalic(true); | |
font.setUnderline(FontUnderlineType.SINGLE); | |
font.setColor(Color.fromArgb(0xffff0000)); | |
style1.setHorizontalAlignment(TextAlignmentType.CENTER); | |
// create another style | |
style2 = wb.createStyle(); | |
style2.setCustom("#,##0.00"); | |
font = style2.getFont(); | |
font.setName("Copperplate Gothic Bold"); | |
font.setSize(8); | |
style2.setPattern(BackgroundType.SOLID); | |
style2.setForegroundColor(Color.fromArgb(0xff0000ff)); | |
style2.setBorder(BorderType.TOP_BORDER, CellBorderType.THICK, Color.getBlack()); | |
style2.setVerticalAlignment(TextAlignmentType.CENTER); | |
} | |
public boolean isGatherString() { | |
return false; | |
} | |
public int nextCell() { | |
if (colIndex < maxColIndex) { | |
colIndex++; | |
return colIndex; | |
} | |
return -1; | |
} | |
public int nextRow() { | |
if (rowIndex < maxRowIndex) { | |
rowIndex++; | |
colIndex = -1; // reset column index | |
if (rowIndex % 1000 == 0) { | |
System.out.println("Row " + rowIndex); | |
} | |
return rowIndex; | |
} | |
return -1; | |
} | |
public void startCell(Cell cell) { | |
if (rowIndex % 50 == 0 && (colIndex == 0 || colIndex == 3)) { | |
// do not change the content of hyperlink. | |
return; | |
} | |
if (colIndex < 10) { | |
cell.putValue("test_" + rowIndex + "_" + colIndex); | |
cell.setStyle(style1); | |
} else { | |
if (colIndex == 19) { | |
cell.setFormula("=Rand() + test!L1"); | |
} else { | |
cell.putValue(rowIndex * colIndex); | |
} | |
cell.setStyle(style2); | |
} | |
} | |
public void startRow(Row row) { | |
row.setHeight(25); | |
} | |
public boolean startSheet(int sheetIndex) { | |
if (sheetIndex < sheetCount) { | |
// reset row/column index | |
rowIndex = -1; | |
colIndex = -1; | |
return true; | |
} | |
return false; | |
} | |
} |
// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-Java | |
public class Demo { | |
private static final String OUTPUT_FILE_PATH = Utils.getDataDir(LightCellsDataProviderDemo.class); | |
public static void main(String[] args) throws Exception { | |
// Instantiate a new Workbook | |
Workbook wb = new Workbook(); | |
// set the sheet count | |
int sheetCount = 1; | |
// set the number of rows for the big matrix | |
int rowCount = 100000; | |
// specify the worksheet | |
for (int k = 0; k < sheetCount; k++) { | |
Worksheet sheet = null; | |
if (k == 0) { | |
sheet = wb.getWorksheets().get(k); | |
sheet.setName("test"); | |
} else { | |
int sheetIndex = wb.getWorksheets().add(); | |
sheet = wb.getWorksheets().get(sheetIndex); | |
sheet.setName("test" + sheetIndex); | |
} | |
Cells cells = sheet.getCells(); | |
// set the columns width | |
for (int j = 0; j < 15; j++) { | |
cells.setColumnWidth(j, 15); | |
} | |
// traverse the columns for adding hyperlinks and merging | |
for (int i = 0; i < rowCount; i++) { | |
// The first 10 columns | |
for (int j = 0; j < 10; j++) { | |
if (j % 3 == 0) { | |
cells.merge(i, j, 1, 2, false, false); | |
} | |
if (i % 50 == 0) { | |
if (j == 0) { | |
sheet.getHyperlinks().add(i, j, 1, 1, "test!A1"); | |
} else if (j == 3) { | |
sheet.getHyperlinks().add(i, j, 1, 1, "http://www.google.com"); | |
} | |
} | |
} | |
// The second 10 columns | |
for (int j = 10; j < 20; j++) { | |
if (j == 12) { | |
cells.merge(i, j, 1, 3, false, false); | |
} | |
} | |
} | |
} | |
// Create an object with respect to LightCells data provider | |
LightCellsDataProviderDemo dataProvider = new LightCellsDataProviderDemo(wb, 1, rowCount, 20); | |
// Specify the XLSX file's Save options | |
OoxmlSaveOptions opt = new OoxmlSaveOptions(); | |
// Set the data provider for the file | |
opt.setLightCellsDataProvider(dataProvider); | |
// Save the big file | |
wb.save(OUTPUT_FILE_PATH + "/DemoTest.xlsx", opt); | |
} | |
} |
Büyük Excel Dosyalarını Okuma
Aspose.Cells, programınızda uygulanması gereken LightCellsDataHandler adlı bir arabirim sağlar. Arayüz, büyük elektronik tablo dosyalarını hafif bir modda okumak için veri sağlayıcıyı temsil eder.
Bu modda bir çalışma kitabı okurken, çalışma kitabındaki her çalışma sayfasını okurken startSheet() kontrol edilir. Bir sayfa için, startSheet() işlevi true değerini döndürürse, sayfanın satırlarındaki ve sütunlarındaki hücrelerin tüm verileri ve özellikleri kontrol edilir ve işlenir. Her satır için, işlenmesi gerekip gerekmediğini kontrol etmek için startRow() çağrılır. Bir satırın işlenmesi gerekiyorsa, önce satırın özellikleri okunur ve geliştiriciler processRow() ile özelliklerine erişebilir.
Satırdaki hücrelerin de işlenmesi gerekiyorsa, processRow() işlevi true değerini döndürür ve satırdaki her mevcut hücrenin işlenmesi gerekip gerekmediğini kontrol etmek için startCell() işlevi çağrılır. Olursa, processCell() çağrılır.
Aşağıdaki örnek kod, bu işlemi göstermektedir. Program, milyonlarca kayıt içeren büyük bir dosyayı okur. Çalışma kitabındaki her sayfayı okumak biraz zaman alır. Örnek kod, dosyayı okur ve her çalışma sayfası için toplam hücre sayısını, dize sayısını ve formül sayısını alır.
// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-Java | |
public class LightCellsTest1 { | |
public static void main(String[] args) throws Exception { | |
String dataDir = Utils.getDataDir(LightCellsTest1.class); | |
LoadOptions opts = new LoadOptions(); | |
LightCellsDataHandlerVisitCells v = new LightCellsDataHandlerVisitCells(); | |
opts.setLightCellsDataHandler((LightCellsDataHandler) v); | |
Workbook wb = new Workbook(dataDir + "LargeBook1.xlsx", opts); | |
int sheetCount = wb.getWorksheets().getCount(); | |
System.out.println("Total sheets: " + sheetCount + ", cells: " + v.cellCount + ", strings: " + v.stringCount | |
+ ", formulas: " + v.formulaCount); | |
} | |
} |
LightCellsDataHandler arabirimini uygulayan bir sınıf
// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-Java | |
public class LightCellsDataHandlerVisitCells implements LightCellsDataHandler { | |
public int cellCount; | |
public int formulaCount; | |
public int stringCount; | |
public LightCellsDataHandlerVisitCells() { | |
this.cellCount = 0; | |
this.formulaCount = 0; | |
this.stringCount = 0; | |
} | |
public int cellCount() { | |
return cellCount; | |
} | |
public int formulaCount() { | |
return formulaCount; | |
} | |
public int stringCount() { | |
return stringCount; | |
} | |
public boolean startSheet(Worksheet sheet) { | |
System.out.println("Processing sheet[" + sheet.getName() + "]"); | |
return true; | |
} | |
public boolean startRow(int rowIndex) { | |
return true; | |
} | |
public boolean processRow(Row row) { | |
return true; | |
} | |
public boolean startCell(int column) { | |
return true; | |
} | |
public boolean processCell(Cell cell) { | |
this.cellCount = this.cellCount + 1; | |
if (cell.isFormula()) { | |
this.formulaCount = this.formulaCount + 1; | |
} else if (cell.getType() == CellValueType.IS_STRING) { | |
this.stringCount = this.stringCount + 1; | |
} | |
return false; | |
} | |
} |