Apache POI Excel - genişletilecek sütunlar nasıl yapılandırılır?


102

Bazı verileri Apache POI APIüretmek excel spreadsheetiçin kullanıyorum .

Karşılaştığım sorun, elektronik tablo oluşturulduğunda ve açıldığında, sütunların genişletilmemesi, böylece Tarih formatlı metin gibi bazı uzun metinlerin ilk bakışta görünmemesidir.

Sütun genişliğini ayarlamak için kenarlığı genişletmek veya sürüklemek için excel'de sütun kenarlığına çift tıklayabilirdim, ancak 20'den fazla sütun olabilir ve bunu elektronik tabloyu her açtığımda manuel olarak yapmak istemem :(

Öğrendim (yanlış yöntem olsa da) groupRow()ve setColumnGroupCollapsed()hile yapabilirim ama şansım yok. Belki de yanlış kullanıyorum.

Örnek Kod pasajı

        Workbook wb = new HSSFWorkbook();
        CreationHelper createHelper = wb.getCreationHelper();
        //create sheet
        Sheet sheet = wb.createSheet("masatoSheet");

        //not really working yet.... :(
        //set group for expand/collapse
        //sheet.groupRow(0, 10); //just random fromRow toRow argument values...
        //sheet.setColumnGroupCollapsed(0, true);

        //create row
        Row row = sheet.createRow((short)0);
        //put a cell in the row and store long text data
        row.createCell(0).setCellValue("Loooooooong text not to show up first");

Bu elektronik tablo oluşturulduğunda, hücrede "Looooooong metni ilk görünmeyecek" dizesi bulunur, ancak sütun genişletilmediğinden sadece "Loooooooo" görünür.

Elektronik tablomu açtığımda, sütun zaten genişletilmiş olacak şekilde nasıl yapılandırabilirim ???



Bunu başarmak için İÇN'yi kullanmanın bir yolunu arıyor görünüyorsunuz. Ancak bunu sadece Excel'de yapmak için tüm sayfayı seçin ve AB sütun başlığı sınırına çift tıklayın. Bunu birkaç sayfaya yapmanız gerekiyorsa, kodlu bir çözüm size daha iyi hizmet edebilir.
ort.

Yanıtlar:


178

Tüm verilerinizi sayfaya ekledikten sonraautoSizeColumn(int column) , sütunları uygun boyuta otomatik olarak sığdırmak için sayfanızı arayabilirsiniz .

İşte API'ye bir bağlantı .

Daha fazla referans için bu gönderiye bakın Apache poi kullanırken Excel hücre boyutunu içeriğin boyutuna uydurma sorunu


8
Sadece işaret etmek istedim autoSizeColumniyi ölçek değildir ve olmayacak süper satırlara çok varsa yavaş. Biraz hile yapmam ve bu soruda önerilene benzer bir şey yapmam gerekiyordu .
lbstr

9
AutoSizeColumn hakkında uyarı ; bu, java Yazı tipinin kullanılabilir olmasını gerektirir. Bu, sunucularda kullanılan başsız java jre'nin bir parçası değildir ve bir NullPointerException oluşturur.
Stephen Dillon

@StephenDillon Yazı tipi yapılandırması için boş göstericinin nasıl düzeltileceği hakkında bir fikriniz var mı?
Veeshal

Bulduğumuz en iyi yol, sütun içindeki her satırın üzerinde döngü yapmak, en uzun karakter uzunluğunu bulmak ve x + ile çarparak bir tampon eklemek oldu. X, neyin uygun olduğunu görmek için deneme yanılma yöntemini kullanın, ancak ortalama bir karakter genişliği olmalıdır. Yazı tipi olmadan doğruyu yapabileceğinize inanmıyorum ama oldukça yaklaşıyoruz. Aksi takdirde, kullanıcı onu ilk açtığında düzeltmek için excel'e bir makro ekleyebilirsiniz, bu en iyi yöntemdi ancak makroların etkinleştirilmesini gerektirir
Stephen Dillon

47

İpucu: Otomatik boyutlandırmanın çalışması için, verileri excel'e doldurduktan sonra arama sheet.autoSizeColumn(columnNumber)yapılmalıdır .

Verileri doldurmadan önce yöntemi çağırmanın bir etkisi olmayacaktır.



Burada verilen cevap Java ile ilgilidir, oysa yorumda verilen bağlantı Android ile ilgilidir. Cevap hala tüm Java durumlarında çalışmaktadır (java Yazı Tipine sahip olmayan başsız java JRE'ler hariç).
Unni Kris

teşekkürler, func hesapladım ve setColumnWidth'i şu şekilde kullandım: (5 until row.lastCellNum).forEach { colNum -> val columnWidth = (row.getCell(colNum).toString().length * 0.44 + 2.24) * 768 reportSheet.setColumnWidth(colNum, columnWidth.toInt()) }
user7856586

@ user7856586 bu yöntemi benim için biraz daha detaylandırabilir misin
Mehroz Mustafa

40

Bir çalışma kitabındaki tüm sütunları otomatik olarak boyutlandırmak istiyorsanız, işte yararlı olabilecek bir yöntem:

public void autoSizeColumns(Workbook workbook) {
    int numberOfSheets = workbook.getNumberOfSheets();
    for (int i = 0; i < numberOfSheets; i++) {
        Sheet sheet = workbook.getSheetAt(i);
        if (sheet.getPhysicalNumberOfRows() > 0) {
            Row row = sheet.getRow(sheet.getFirstRowNum());
            Iterator<Cell> cellIterator = row.cellIterator();
            while (cellIterator.hasNext()) {
                Cell cell = cellIterator.next();
                int columnIndex = cell.getColumnIndex();
                sheet.autoSizeColumn(columnIndex);
            }
        }
    }
}

Ben alıyorum NullPointerExceptionat row.cellIterator(). Hücrelerden birinde değerim olmadığı için mi?
rakeeee

10

Bunun gibi bir şey deneyebilirsiniz:

HSSFSheet summarySheet = wb.createSheet();
summarySheet.setColumnWidth(short column, short width);

Burada parametreler şunlardır: sayfadaki sütun numarası ve genişliği Ancak, genişlik birimleri oldukça küçüktür, örneğin 4000'i deneyebilirsiniz.


Bilmek güzel, teşekkürler! Sütun dizesinin dinamik olarak oluşturulabileceği amacım için, otomatik boyutlandırma yönteminin duruma uygun olacağını düşünüyorum.
Miyav


5

aşağıdaki örnek kod

HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("your sheet name");
HSSFRow row = sheet.createRow(0);

cell = row.createCell(0);
cell.setCellValue("A BIG NAME WITH AUTO SIZE FEATURE ENABLED");

// bu çok önemli

sheet.autoSizeColumn(0);

// bağımsız değişken hücre numarası olmalıdır

cell = row.createCell(1);
cell.setCellValue("a big name without auto size feature enabled");

Çıkışı kontrol edin ve çıldırın :)


2
sheet.setColumnWidth (columnIndex, width) ayrıca bakmak isteyeceğiniz bir yöntemdir
Mateen

3

Sütunlarınızın sayısını biliyorsanız (fe bir koleksiyon listesine eşittir). Bir sayfanın tüm sütunlarını ayarlamak için bu tek astarı kullanabilirsiniz (en az java 8 kullanıyorsanız):

IntStream.range(0, columnCount).forEach((columnIndex) -> sheet.autoSizeColumn(columnIndex));

1

Aşağıdaki basit çözümü kullanıyorum:

Bu sizin çalışma kitabınız ve sayfanızdır:

XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("YOUR Workshhet");

ardından sayfanıza sütun ve satırlarla veri ekleyin. Sayfaya veri ekledikten sonra aşağıdaki kodu autoSizeColumngenişliğe yazın.

for (int columnIndex = 0; columnIndex < 15; columnIndex++) {
                    sheet.autoSizeColumn(columnIndex);
                }

Burada, 15 yerine, sayfanıza sütun sayısını eklersiniz.

Umarım birisi buna yardım eder.



0

Çok basit, bu tek satırlık kodu kullanın dataSheet.autoSizeColumn (0)

veya parantez dataSheet.autoSizeColumn'daki sütun sayısını belirtin (hücre numarası)


0

Metni de kaydırabilirsiniz. PFB örnek kodu:

CellStyle wrapCellStyle = new_workbook.createCellStyle();
                    wrapCellStyle.setWrapText(true);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.