рд╣рдо рддреИрдпрд╛рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ PHP рдореЗрдВ xlsx рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рдПрдХ рд╣рдЬрд╛рд░рд╡реАрдВ рдмрд╛рд░ рд╡рд╛рдкрд╕реА рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢реНрди рдХреЛ рд╕рднреА рдкрдХреНрд╖реЛрдВ рд╕реЗ рдЪреВрд╕рд╛: рдмреЗрд╡рдХреВрдл рдкреНрд░рдмрдВрдзрдХреЛрдВ - рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд╕рд╛рде рдкрд░рд╛рдорд░реНрд╢ рдХреЗ рдмрд┐рдирд╛ - рдЧреНрд░рд╛рд╣рдХ рдХреЛ xls (x) рд╕реЗ рд╕рд╛рдЗрдЯ рдкрд░ рдбреЗрдЯрд╛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ред

рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЧреНрд░рд╛рд╣рдХ рдХрд╛ рд╣реЙрд╕реНрдЯрд▓ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП 64 рдПрдордмреА рдХреА рдореЗрдореЛрд░реА рджреЗрддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдзреНрдпрд╛рди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХреНрд╕реЗрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рдлрд╛рдЗрд▓реЗрдВ рдмрд┐рдирд╛ рдлреЙрд░реНрдореЗрдЯ рдХреЗ 10-15 рдПрдордмреА рд╡рдЬрди рдХреА рд╣реИрдВ, рдХрд┐ рдЗрд╕реЗ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп, PHPExel рдЦрд╛рддрд╛ рд╣реИ (рдкрд░реАрдХреНрд╖рдг рд╕рд░реНрд╡рд░ рдкрд░) рд▓рдЧрднрдЧ 500 рдПрдордмреА рд╕реНрдореГрддрд┐ред
рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ 5mb рддрдХ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ред

рдкреВрд░реНрд╡ рд╢рд░реНрдд:
1. рдЗрдВрдЯрд░рдиреЗрдЯ рдХреИрдЯрд▓реЙрдЧ рдореЗрдВ рдорд╛рд▓ рдкрд░ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде 10-20 рдореЗрдВ рд╢реАрдЯ рдХрд╛ рдПрдХреНрд╕рд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкрддреНрд░рдХ рдореЗрдВ, рд╢реАрд░реНрд╖рдХ "рдирд╛рдо", "рдореВрд▓реНрдп", рдЖрджрд┐ рд╣реИред + рдЕрддрд┐рд░рд┐рдХреНрдд 40 рдХреЙрд▓рдо рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ - рдФрд░ "рд╡рд╛рдИ-рдПрдХреНрд╕реЗрд▓-рд╕реЗрдВрдЯреАрдореАрдЯрд░-рд╕реНрдХреНрд░реЛрд▓рд░" рдХреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛;
2. рдХреЛрдИ рднреА CSV рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рднреА рдЧреНрд░рд╛рд╣рдХ рдХрд╛ рдбреЗрдЯрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Exel рдореЗрдВ рд╣реИ рдФрд░ рд╡рд╣ рдЗрд╕реЗ рдмрдЪрд╛рдиреЗ рдирд╣реАрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реИ ... рдЙрдиреНрд╣реЛрдВрдиреЗ рдпрд╣рд╛рдВ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдерд╛;
3. рд╕реНрдкреНрд░реЗрдбрд╢реАрдЯ_Excel_Writer рдХреЛ рдЧреИрд░-рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХрддрд╛ рдХреЗ рдХрд╛рд░рдг рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рд╕реНрдореГрддрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛;
4. рдЬреЛ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рд╣реИ, Google рдиреЗ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рдорд╛рдзрд╛рди рдХреА рдкреЗрд╢рдХрд╢ рдирд╣реАрдВ рдХреАред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рдХреЛ рднреА PHP * nix рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рд╣реИ, рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖред

рд╕рдорд╛рдзрд╛рди:
Google рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЫрд╛рдВрдЯрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ (рдПрд╣, рдореЗрд░реЗ рдкрд┐рддрд╛ рдиреЗ рдореБрдЭреЗ рд╕рд┐рдЦрд╛рдпрд╛ ...)ред рд╡рд╣рд╛рдБ рдЦреЛрдЬрд╢рдмреНрджреЛрдВ рдХреЛ рджреЗрдЦрдХрд░ рдУрдкрди XML рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ рдЬрд╝рд┐рдк рд╕рдВрдкреАрдбрд╝рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░, рдЙрдиреНрд╣реЛрдВрдиреЗ рдЬрд▓реНрджреА рд╕реЗ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдФрд░ рдмрд╛рддрдЪреАрдд рдХреЛ xlsx рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдФрд░ рдХреЗрд╡рд▓: тАЬрдареАрдХ рд╣реИ, рддреБрдо рд╕рдордЭрддреЗ рд╣реЛ! 21 рд╡реАрдВ рд╕рджреА рдХреЗ рдмрд╛рдж! рд╣рдо рдкреБрд░рд╛рдиреЗ рдХреЛ рдХреНрдпреЛрдВ рдкрдХрдбрд╝реЗрдВ! рдЖрдкрдХреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдПрдХ рдкреИрд░ рдХреЗ рд╕рд╛рде рдЦрдбрд╝реЗ рд╣реЛрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ! тАЭ

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ: рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдЕрдирдкреИрдХ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВред
рдПрдХ рдкреВрд░реА рд╕реВрдЪреА рдХреЛ рдЕрд╡рдХрд╛рд╢ рдкрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо [xl] рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреА рд╕рд╛рдордЧреНрд░реА, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ / xl / рдХрд╛рд░реНрдпрдкрддреНрд░рдХ / рдФрд░ рдлрд╝рд╛рдЗрд▓ /xl/saredStrings.xml рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред
рдлрд╝рд╛рдЗрд▓ /xl/workbook.xml рдореЗрдВ рдЪрд╛рджрд░реЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ рдЪрд╛рджрд░реЛрдВ рдХреЗ рдирд╛рдо рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдЦрдбрд╝рд╛ рдирд╣реАрдВ рд╣реБрдЖ, рдореИрдВ рдЗрд╕ рдордж рдХреЛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред

/xl/sharedStrings.xml

... <si> <t></t> </si> <si> <t></t> </si> <si> <t></t> </si> <si> <t>URL</t> </si> <si> <t>!</t> </si> <si> <t>!</t> </si> <si> <t>~1, 220-240 , 50 </t> </si> ... 

рдФрд░ рдЗрд╕реА рддрд░рд╣ рдПрдХ рд╣реА рдирд╕ рдореЗрдВред рд╕реНрд░реЛрдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдкрд╛рда рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рд╕рднреА рдЪрд╛рджрд░реЛрдВ рд╕реЗ! рдЕрднреА рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВред
  $xml = simplexml_load_file(PATH . '/upload/xls_data/xl/sharedStrings.xml'); $sharedStringsArr = array(); foreach ($xml->children() as $item) { $sharedStringsArr[] = (string)$item->t; } 


/ xl / рдХрд╛рд░реНрдпрдкрддреНрд░рдХ /
рдпрд╣ рдЗрди рд╢реАрдЯреЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде "sheet1.xml" рдкреНрд░рдХрд╛рд░ рдХреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╣рдо рд╕рд╛рдордЧреНрд░реА рдФрд░ рдЙрд╕рдХреЗ рдмрдЪреНрдЪреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ <рдкрдВрдХреНрддрд┐ ...>ред
 ... <sheetData> ... <row r="1" spans="1:43" ht="48.75" customHeight="1" x14ac:dyDescent="0.2"> <cr="A1" s="1" t="s"> <v>0</v> </c> <cr="B1" s="1" t="s"> <v>1</v> </c> <cr="C1" s="2" t="s"> <v>2</v> </c> <cr="E2" s="12"> <v>2</v> </c> <cr="F2" s="12"/> .... </row> <row r="2" spans="1:43" ht="13.5" customHeight="1" x14ac:dyDescent="0.2"> ... </sheetData> ... 

рддреБрд▓рдирд╛ рдФрд░ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдпрд╣ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдХрд┐ рд╕реЗрд▓ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ [t = "s"] (рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдЯрд╛рдЗрдк = рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдПрдХ рд╕рдВрдХреЗрдд рд╣реИ рдХрд┐ рд╣рдо рд╢реЗрдпрд░рд╕реНрдЯреНрд░реЗрдХреНрд╕ред Xml рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВред рд╕реВрдЪрдХ - рдореВрд▓реНрдп - рддрддреНрд╡ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП $ рд╕реЗ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВред рдпрджрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕реЗрд▓ рдХреЗ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡рдпрдВ рдорд╛рди рд▓реЗрдВред

рд╣рдо рдПрдХрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
  $handle = @opendir(PATH . '/upload/xls_data/xl/worksheets'); $out = array(); while ($file = @readdir($handle)) { //      /xl/worksheets/ if ($file != "." && $file != ".." && $file != '_rels') { $xml = simplexml_load_file(PATH . '/upload/xls_data/xl/worksheets/' . $file); //   $row = 0; foreach ($xml->sheetData->row as $item) { $out[$file][$row] = array(); //    $cell = 0; foreach ($item as $child) { $attr = $child->attributes(); $value = isset($child->v)? (string)$child->v:false; $out[$file][$row][$cell] = isset($attr['t']) ? $sharedStringsArr[$value] : $value; $cell++; } $row++; } } } var_dump($out); 


рдЖрдЙрдЯрдкреБрдЯ рдкрд░, рд╣рдореЗрдВ рдПрдХ рдмрд╣реБрдЖрдпрд╛рдореА рд╕рд░рдгреА рдорд┐рд▓рддреА рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрднрд╡ рд╣реИ, рдпрд╛ рдЖрдк рддреБрд░рдВрдд рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╣ рд╕рднреА рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдЬреА рдорд╛рдорд▓рд╛ рд╣реИред

рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ xlsx рдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдирд╣реАрдВ рд╕рдордЭрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╡рд┐рд╢рд┐рд╖реНрдЯ xlsx рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдкреВрд░рд╛ рдХрд┐рдпрд╛ред рдЖрдЦрд┐рд░рдХрд╛рд░, рд╕реВрддреНрд░ рдФрд░ рдЪрд┐рддреНрд░ (t = "i"?) рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрдм рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдм рдореИрдВ xslx рд╕реЗ рдкрд╛рда рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдВрджрд╛ рдкреНрд░рдгрд╛рд▓реА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдорд╛рдВрдЧ рдореЗрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓рд╛ред

рдкреБрдирд╢реНрдЪ рдмрд╕ рд░рдЦрдиреЗ рдХреЗ рдЯреИрдЧ рдмрдбрд╝реА рдПрдХреНрд╕реЗрд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдереЗ ред рдпрд╣ рдПрдХ рдХрд╛рд░рдЦрд╛рдирд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдЗрд╕реЗ Google рдирд╣реАрдВ - рдореИрдВ рдмрд╣реБрдд рд╕рдордп рдмрдЪрд╛рдКрдВрдЧрд╛ред

рдпреБрдкреАрдбреА:
рдпрд╣ рд╕рд┐рд░реНрдл рдпрд╣ рдирд┐рдХрд▓рд╛ рдХрд┐ <c> рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ рдЦрд╛рд▓реА рд╕реЗрд▓ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ <c>, рдпрд╛ <c> рдХреА рдХрдореА рд╕реЗред рдЖрдкрдХреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ "рдЖрд░" рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
  <cr="A1" s="1" t="s"/> <cr="B1" s="1" t="s"> <v>1</v> </c> <!--   1--> <cr="D1" s="2" t="s"> <v>2</v> </c> <cr="E1" s="12"/> 

рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдореИрдВ рдЗрд╕реЗ рд╕рд╣реА рдХрд░реВрдВрдЧрд╛ред

Source: https://habr.com/ru/post/In140352/


All Articles