1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
27:
28:
29: 30: 31: 32: 33: 34: 35:
36: class PHPExcel_Writer_Excel2007_Comments extends PHPExcel_Writer_Excel2007_WriterPart
37: {
38: 39: 40: 41: 42: 43: 44:
45: public function writeComments(PHPExcel_Worksheet $pWorksheet = null)
46: {
47:
48: $objWriter = null;
49: if ($this->getParentWriter()->getUseDiskCaching()) {
50: $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
51: } else {
52: $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);
53: }
54:
55:
56: $objWriter->startDocument('1.0','UTF-8','yes');
57:
58:
59: $comments = $pWorksheet->getComments();
60:
61:
62: $authors = array();
63: $authorId = 0;
64: foreach ($comments as $comment) {
65: if (!isset($authors[$comment->getAuthor()])) {
66: $authors[$comment->getAuthor()] = $authorId++;
67: }
68: }
69:
70:
71: $objWriter->startElement('comments');
72: $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main');
73:
74:
75: $objWriter->startElement('authors');
76: foreach ($authors as $author => $index) {
77: $objWriter->writeElement('author', $author);
78: }
79: $objWriter->endElement();
80:
81:
82: $objWriter->startElement('commentList');
83: foreach ($comments as $key => $value) {
84: $this->_writeComment($objWriter, $key, $value, $authors);
85: }
86: $objWriter->endElement();
87:
88: $objWriter->endElement();
89:
90:
91: return $objWriter->getData();
92: }
93:
94: 95: 96: 97: 98: 99: 100: 101: 102:
103: public function _writeComment(PHPExcel_Shared_XMLWriter $objWriter = null, $pCellReference = 'A1', PHPExcel_Comment $pComment = null, $pAuthors = null)
104: {
105:
106: $objWriter->startElement('comment');
107: $objWriter->writeAttribute('ref', $pCellReference);
108: $objWriter->writeAttribute('authorId', $pAuthors[$pComment->getAuthor()]);
109:
110:
111: $objWriter->startElement('text');
112: $this->getParentWriter()->getWriterPart('stringtable')->writeRichText($objWriter, $pComment->getText());
113: $objWriter->endElement();
114:
115: $objWriter->endElement();
116: }
117:
118: 119: 120: 121: 122: 123: 124:
125: public function writeVMLComments(PHPExcel_Worksheet $pWorksheet = null)
126: {
127:
128: $objWriter = null;
129: if ($this->getParentWriter()->getUseDiskCaching()) {
130: $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
131: } else {
132: $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);
133: }
134:
135:
136: $objWriter->startDocument('1.0','UTF-8','yes');
137:
138:
139: $comments = $pWorksheet->getComments();
140:
141:
142: $objWriter->startElement('xml');
143: $objWriter->writeAttribute('xmlns:v', 'urn:schemas-microsoft-com:vml');
144: $objWriter->writeAttribute('xmlns:o', 'urn:schemas-microsoft-com:office:office');
145: $objWriter->writeAttribute('xmlns:x', 'urn:schemas-microsoft-com:office:excel');
146:
147:
148: $objWriter->startElement('o:shapelayout');
149: $objWriter->writeAttribute('v:ext', 'edit');
150:
151:
152: $objWriter->startElement('o:idmap');
153: $objWriter->writeAttribute('v:ext', 'edit');
154: $objWriter->writeAttribute('data', '1');
155: $objWriter->endElement();
156:
157: $objWriter->endElement();
158:
159:
160: $objWriter->startElement('v:shapetype');
161: $objWriter->writeAttribute('id', '_x0000_t202');
162: $objWriter->writeAttribute('coordsize', '21600,21600');
163: $objWriter->writeAttribute('o:spt', '202');
164: $objWriter->writeAttribute('path', 'm,l,21600r21600,l21600,xe');
165:
166:
167: $objWriter->startElement('v:stroke');
168: $objWriter->writeAttribute('joinstyle', 'miter');
169: $objWriter->endElement();
170:
171:
172: $objWriter->startElement('v:path');
173: $objWriter->writeAttribute('gradientshapeok', 't');
174: $objWriter->writeAttribute('o:connecttype', 'rect');
175: $objWriter->endElement();
176:
177: $objWriter->endElement();
178:
179:
180: foreach ($comments as $key => $value) {
181: $this->_writeVMLComment($objWriter, $key, $value);
182: }
183:
184: $objWriter->endElement();
185:
186:
187: return $objWriter->getData();
188: }
189:
190: 191: 192: 193: 194: 195: 196: 197:
198: public function _writeVMLComment(PHPExcel_Shared_XMLWriter $objWriter = null, $pCellReference = 'A1', PHPExcel_Comment $pComment = null)
199: {
200:
201: list($column, $row) = PHPExcel_Cell::coordinateFromString($pCellReference);
202: $column = PHPExcel_Cell::columnIndexFromString($column);
203: $id = 1024 + $column + $row;
204: $id = substr($id, 0, 4);
205:
206:
207: $objWriter->startElement('v:shape');
208: $objWriter->writeAttribute('id', '_x0000_s' . $id);
209: $objWriter->writeAttribute('type', '#_x0000_t202');
210: $objWriter->writeAttribute('style', 'position:absolute;margin-left:' . $pComment->getMarginLeft() . ';margin-top:' . $pComment->getMarginTop() . ';width:' . $pComment->getWidth() . ';height:' . $pComment->getHeight() . ';z-index:1;visibility:' . ($pComment->getVisible() ? 'visible' : 'hidden'));
211: $objWriter->writeAttribute('fillcolor', '#' . $pComment->getFillColor()->getRGB());
212: $objWriter->writeAttribute('o:insetmode', 'auto');
213:
214:
215: $objWriter->startElement('v:fill');
216: $objWriter->writeAttribute('color2', '#' . $pComment->getFillColor()->getRGB());
217: $objWriter->endElement();
218:
219:
220: $objWriter->startElement('v:shadow');
221: $objWriter->writeAttribute('on', 't');
222: $objWriter->writeAttribute('color', 'black');
223: $objWriter->writeAttribute('obscured', 't');
224: $objWriter->endElement();
225:
226:
227: $objWriter->startElement('v:path');
228: $objWriter->writeAttribute('o:connecttype', 'none');
229: $objWriter->endElement();
230:
231:
232: $objWriter->startElement('v:textbox');
233: $objWriter->writeAttribute('style', 'mso-direction-alt:auto');
234:
235:
236: $objWriter->startElement('div');
237: $objWriter->writeAttribute('style', 'text-align:left');
238: $objWriter->endElement();
239:
240: $objWriter->endElement();
241:
242:
243: $objWriter->startElement('x:ClientData');
244: $objWriter->writeAttribute('ObjectType', 'Note');
245:
246:
247: $objWriter->writeElement('x:MoveWithCells', '');
248:
249:
250: $objWriter->writeElement('x:SizeWithCells', '');
251:
252:
253:
254:
255:
256: $objWriter->writeElement('x:AutoFill', 'False');
257:
258:
259: $objWriter->writeElement('x:Row', ($row - 1));
260:
261:
262: $objWriter->writeElement('x:Column', ($column - 1));
263:
264: $objWriter->endElement();
265:
266: $objWriter->endElement();
267: }
268: }
269: