как я могу покрасить строки в файле xlsx - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть файл xls, который я хочу по-разному раскрасить.

Мой файл xlsx похож на приведенный ниже, назовем его sample.xlsx

>sp|Q96B97|SH3K1_HUMAN SH3 domain-containing kinase-binding protein 1 OS=Homo sapiens OX=9606 GN=SH3KBP1 PE=1 SV=2
MVEAIVEFDYQAQHDDELTISVGEIITNIRKEDGGWW
>sp|Q9UBS4|DJB11_HUMAN DnaJ homolog subfamily B member 11 OS=Homo sapiens OX=9606 GN=DNAJB11 PE=1 SV=1
KLALQLHPDRNPDDPQAQEKFQDLGAAYEVLSDSEKRKQYD
>sp|P61916|NPC2_HUMAN NPC intracellular cholesterol transporter 2 OS=Homo sapiens OX=9606 GN=NPC2 PE=1 SV=1
CQLSKGQSYSVNVTFTSNIQSKSSKAVVHGILMGVP

Iхочу прочитать, а затем сохранить его, когда я раскрасю буквы.Я хочу раскрасить D в желтый цвет

>sp|Q96B97|SH3K1_HUMAN SH3 domain-containing kinase-binding protein 1 OS=Homo sapiens OX=9606 GN=SH3KBP1 PE=1 SV=2
MVEAIVEF**D**YQAQH**DD**ELTISVGEIITNIRKE**D**GGWW
>sp|Q9UBS4|DJB11_HUMAN DnaJ homolog subfamily B member 11 OS=Homo sapiens OX=9606 GN=DNAJB11 PE=1 SV=1
KLALQLHPDRNP**DD**PQAQEKFQ**D**LGAAYEVLS**D**SEKRKQY**D**
>sp|P61916|NPC2_HUMAN NPC intracellular cholesterol transporter 2 OS=Homo sapiens OX=9606 GN=NPC2 PE=1 SV=1
CQLSKGQSYSVNVTFTSNIQSKSSKAVVHGILMGVP

Я пытался сделать это безуспешно

#!/usr/bin/perl
use strict;
use warnings;
use Spreadsheet::WriteExcel; 
use Excel::Writer::XLSX;

# Create an Excel workbook and worksheet
my $workbook = Spreadsheet::WriteExcel->new('output.xls'); 
my $workbook  = Excel::Writer::XLSX->new( 'sample.xlsx' );
if ( !defined $workbook ) {
    die $parser->error(), ".\n";
}
my $worksheet = $workbook->add_worksheet();
my $highlight = $workbook->add_format();
$highlight->set_bg_color('yellow');
my $row = 0;
while (<sample>) {
  chomp;
  next unless /$search_pattern/D;
  my $col = 0;
  my @fields = split;
  foreach my $field (@fields) {
    if ( $field =~ /$search_pattern/D ) {
      $worksheet->write_string($row, $col, $field, $highlight);
    }
    else {
      $worksheet->write_string($row, $col, $field);
    }
    $col++;
  }
  $row++;
}
$workbook->close()

каждая вторая строка начинается с >spчто следует игнорировать.Шаблон поиска должен применяться к другой строке, которая не имеет >sp|

Отредактировано

Теперь я могу читать xls и печатать их

#!/usr/bin/perl

use strict;
use warnings;
use Excel::Reader::XLSX;

    my $reader   = Excel::Reader::XLSX->new();
    my $workbook = $reader->read_file( 'sample.xlsx' );
    if ( !defined $workbook ) {
        die $reader->error(), "\n";
    }
    for my $worksheet ( $workbook->worksheets() ) {
        my $sheetname = $worksheet->name();
        print "Sheet = $sheetname\n";
        while ( my $row = $worksheet->next_row() ) {
            while ( my $cell = $row->next_cell() ) {
                my $row   = $cell->row();
                my $col   = $cell->col();
                my $value = $cell->value();
                print "  Cell ($row, $col) = $value\n";
            }
        }
    }

#Sheet = Sheet1
#  Cell (0, 0) = >sp|Q96B97|SH3K1_HUMAN SH3 domain-containing kinase-binding protein 1 OS=Homo sapiens OX=9606 GN=SH3KBP1 PE=1 SV=2
#  Cell (1, 0) = MVEAIVEFDYQAQHDDELTISVGEIITNIRKEDGGWW
#  Cell (2, 0) = >sp|Q9UBS4|DJB11_HUMAN DnaJ homolog subfamily B member 11 OS=Homo sapiens OX=9606 GN=DNAJB11 PE=1 SV=1
#  Cell (3, 0) = KLALQLHPDRNPDDPQAQEKFQDLGAAYEVLSDSEKRKQYD
#  Cell (4, 0) = >sp|P61916|NPC2_HUMAN NPC intracellular cholesterol transporter 2 OS=Homo sapiens OX=9606 GN=NPC2 PE=1 SV=1
#  Cell (5, 0) = CQLSKGQSYSVNVTFTSNIQSKSSKAVVHGILMGVP

Теперь я хочу сосредоточиться на ячейке (1,0) и Cell (3, 0) и Cell (5, 0)

1 Ответ

0 голосов
/ 21 февраля 2019

Для Excel :: Writer :: XLSX вам необходимо использовать метод write_rich_string , если вы хотите изменить отдельные части одной ячейки, а не всей ячейки.

синтаксис немного странный.

my $highlight = $workbook->add_format;
$highlight->set_bg_color('yellow');

$worksheet->write_rich_string( 'A1', 'ABC', $highlight, 'D', 'EFG' );

Разбейте вашу строку на сегменты и предшествуйте каждому сегменту, который вы хотите выделить, с помощью объекта формата $highlight.Сегменты, у которых нет объектов перед ними, не форматируются.

Этот способ записи делает это более понятным.Помните, что в Perl списки списаны, поэтому пустые списки () и лишние запятые просто исчезают, а => - это жирная запятая , такая же, как ,.

$worksheet->write_rich_string(
    'A1',                  # cell
     ()         => 'ABC',  # unformatted segment
     $highlight => 'D',    # highlighted
     ()         => 'EFG',  # unformatted
);

Я работаю в Linux и не имею доступа к настоящему Excel.Кажется, что Libre Office не поддерживает это, или я делаю это неправильно, так что это не проверено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...