অ্যাপাচি পিওআই এক্সেল - কলামগুলি কীভাবে প্রসারিত করতে হবে তা কনফিগার করবেন?


102

আমি কিছু ডেটা আউটপুট Apache POI APIতৈরি excel spreadsheetকরতে ব্যবহার করছি ।

আমি যে সমস্যার মুখোমুখি হচ্ছি তা হ'ল যখন স্প্রেডশিটটি তৈরি করা এবং খোলা হয়, কলামগুলি প্রসারিত হয় না যাতে ডেট ফর্ম্যাট করা পাঠ্যের মতো কিছু দীর্ঘ পাঠ প্রথম নজরে প্রদর্শিত না হয়।

আমি কলামের প্রস্থ সামঞ্জস্য করতে সীমানাকে প্রসারিত করতে বা টেনে আনতে কেবল কলামের সীমানাকে ডাবল ক্লিক করতে পারলাম তবে সেখানে 20+ কলাম থাকতে পারে এবং আমি স্প্রেডশিটটি যখনই খুলি তখন নিজেই তা করার কোনও উপায় নেই :(

আমি খুঁজে পেয়েছি (যদিও ভুল পদ্ধতি হতে পারে ) groupRow()এবং setColumnGroupCollapsed()কৌশলটি করতে সক্ষম হতে পারে তবে ভাগ্য নেই। সম্ভবত আমি এটি ভুল উপায়ে ব্যবহার করছি।

নমুনা কোড স্নিপেট

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

যখন এই স্প্রেডশিটটি তৈরি করা হবে, তখন "প্রথম দেখানোর জন্য লুওওওঙ পাঠ্যটি" সেলটিতে রয়েছে তবে কলামটি প্রসারিত না হওয়ায় কেবল "লুওইউ" প্রদর্শিত হচ্ছে।

আমি কীভাবে এটি কনফিগার করব যাতে আমার স্প্রেডশিটটি খুললে কলামটি ইতিমধ্যে প্রসারিত হয় ???



আপনি এটি সম্পাদন করার জন্য POI ব্যবহার করার কোনও উপায় খুঁজছেন বলে মনে হচ্ছে। তবে কেবল এক্সেলের মাধ্যমে এটি করতে পুরো শীটটি নির্বাচন করুন এবং এবি কলাম শিরোনামের সীমানায় ডাবল ক্লিক করুন। আপনার যদি বেশ কয়েকটি শিটগুলিতে এটি করার দরকার হয় তবে একটি কোডেড দ্রবণ আপনাকে আরও ভাল পরিবেশন করতে পারে।
গড়

উত্তর:


178

পরে আপনি পাতায় আপনার সমস্ত ডেটা যোগ করেছেন, আপনি কল করতে পারেন autoSizeColumn(int column)সঠিক মাপ কলাম অটোফিট আপনার পত্রকে

এখানে এপিআই - একটি লিঙ্ক ।

আরও রেফারেন্সের জন্য এই পোস্টটি দেখুন অ্যাপাচি পোই ব্যবহার করার সময় সামগ্রীর আকারের জন্য এক্সেল সেল আকারকে ফিট করার ক্ষেত্রে সমস্যা


8
কেবল এটি চিহ্নিত করতে চেয়েছিলাম যে autoSizeColumnভাল স্কেল করে না এবং আপনার কাছে প্রচুর সারি থাকলে অতি ধীর হয়ে যাবে। আমাকে কিছুটা হ্যাকি পেতে হয়েছিল এবং এই প্রশ্নে যা পরামর্শ দেওয়া হয়েছিল তার অনুরূপ কিছু করতে হয়েছিল ।
lbstr

9
অটোসাইজ কলাম সম্পর্কে সতর্কতা , এর জন্য জাভা ফন্ট উপলব্ধ থাকতে হবে। এটি সার্ভারে ব্যবহৃত হেডলেস জাভা জের অংশ নয় এবং এটি নালপয়েন্টারএক্সসেপশন নিক্ষেপ করবে।
স্টিফেন ডিলন

@ স্টেফেনডিলন ফন্ট কনফিগারেশনের নাল পয়েন্টারটি ঠিক করবেন কীভাবে কোনও ধারণা?
ভিশাল

আমরা যে সবচেয়ে ভাল উপায়টি খুঁজে পেয়েছি তা হল কর্নের প্রতিটি সারিতে লুপ করা, দীর্ঘতম চরের দৈর্ঘ্য সন্ধান করা এবং এক্স + দিয়ে গুণিত করে একটি বাফার যুক্ত করুন। এক্স কী ফিট করে তা পরীক্ষার জন্য ত্রুটি এবং ত্রুটি ব্যবহার করে তবে এটি একটি চরের গড় প্রস্থ হওয়া উচিত। ফন্ট ব্যতীত আমি বিশ্বাস করি না যে আপনি আসলে এটি সঠিকভাবে পেতে পারেন তবে আমরা বেশ কাছে এসেছি। অন্যথায় আপনি প্রথমবার এটি খোলার জন্য এটি ঠিক করার জন্য ম্যাক্রো যুক্ত করতে পারেন, এটি সেরা পদ্ধতি ছিল তবে ম্যাক্রোগুলিকে সক্ষম করা প্রয়োজন
স্টিফেন ডিলন

47

টিপ: অটো আকারের কাজ করার জন্য, কলটি ডেটাটি এক্সেলে স্থান দেওয়ার পরে করা sheet.autoSizeColumn(columnNumber)উচিত ।

ডেটা পপুলেশন করার আগে পদ্ধতিটি কল করা কোনও প্রভাব ফেলবে না।


stackoverflow.com/questions/37069820/… কখনও কখনও যে কাজ করছে না
user7856586

এখানে প্রদত্ত উত্তরটি জাভা সম্পর্কিত, যেখানে মন্তব্যে প্রদত্ত লিঙ্কটি অ্যান্ড্রয়েডের সাথে সম্পর্কিত। উত্তরটি এখনও সমস্ত জাভা ক্ষেত্রে কাজ করে (মাথা বিহীন জাভা জেআরইগুলি ছাড়া যা জাভা ফন্ট উপলভ্য নয়)।
উন্নি ক্রিস

ধন্যবাদ, আমি ফানক গণনা করেছি এবং নিম্নলিখিত পদ্ধতিতে সেট কলাম উইথ ব্যবহার করেছি: (5 until row.lastCellNum).forEach { colNum -> val columnWidth = (row.getCell(colNum).toString().length * 0.44 + 2.24) * 768 reportSheet.setColumnWidth(colNum, columnWidth.toInt()) }
ব্যবহারকারীর 8586586

@ ব্যবহারকারী 8585866565 method86 আপনি আমার এই পদ্ধতিটি আরও বিস্তারিতভাবে বর্ণনা করতে পারেন
মেহরোজ মোস্তফা

40

আপনি যদি কোনও ওয়ার্কবুকের সমস্ত কলামকে স্বয়ংক্রিয় আকার দিতে চান তবে এখানে একটি পদ্ধতি যা কার্যকর হতে পারে:

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

আমি হচ্ছি NullPointerExceptionrow.cellIterator()। আমার কোনও কক্ষের কোনও মূল্য নেই বলেই এটি?
রাকি

10

আপনি এরকম কিছু চেষ্টা করতে পারেন:

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

এখানে প্যারামগুলি রয়েছে: শীটের কলাম নম্বর এবং এর প্রস্থ কিন্তু প্রস্থের ইউনিটগুলি খুব ছোট, উদাহরণস্বরূপ আপনি 4000 চেষ্টা করতে পারেন।


ধন্যবাদ জানার জন্য ভাল! আমি মনে করি যে আমার উদ্দেশ্যে যেখানে কলাম স্ট্রিংটি গতিশীলভাবে উত্পন্ন হতে পারে সেখানে অটো-আকার দেওয়ার পদ্ধতিটি উপযুক্ত হবে।
মায়ো


5

নীচে নমুনা কোড

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

// এটি গুরুত্বপূর্ণ

sheet.autoSizeColumn(0);

// যুক্তি অবশ্যই সেল নম্বর হতে হবে

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

আউটপুট পরীক্ষা করে বাদামে যান :)


4
শীট.সেট কলাম উইথ (কলাম ইনডেক্স, প্রস্থ) এছাড়াও এমন একটি পদ্ধতি যা আপনি একবার দেখতে চান
ম্যাটেন

3

যদি আপনি নিজের কলামগুলির গণনা জানেন (তবে এটি সংগ্রহের তালিকার সমান)। আপনি একটি শীটের সমস্ত কলামগুলি সামঞ্জস্য করতে কেবল এই একটি লাইনার ব্যবহার করতে পারেন (যদি আপনি কমপক্ষে জাভা 8 ব্যবহার করেন):

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

1

আমি সহজ সমাধান নীচে ব্যবহার:

এটি আপনার ওয়ার্কবুক এবং পত্রক:

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

তারপরে কলাম এবং সারিগুলির সাথে আপনার শীটে ডেটা যুক্ত করুন। একবার শীটে ডেটা যুক্ত করার পরে নিম্নলিখিত কোডটি autoSizeColumnপ্রস্থে লিখুন ।

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

এখানে, পরিবর্তে 15, আপনি আপনার শীটে কলামগুলির সংখ্যা যুক্ত করুন।

আশা করি কেউ এটিকে সাহায্য করবে।



0

এটি খুব সহজ, এই এক লাইনের কোড ডেটাশিটটি ব্যবহার করুন aআউটসাইজ কলম (0)

অথবা ব্র্যাকেট ডেটাশিটে ডটকম্যাট কলামের নম্বর দিন (সেল নম্বর)


0

আপনি পাশাপাশি পাঠ্য মোড়তে পারেন। পিএফবি নমুনা কোড:

CellStyle wrapCellStyle = new_workbook.createCellStyle();
                    wrapCellStyle.setWrapText(true);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.