diff --git a/src/Libraries/DSOffice/DSOfficeImages.resx b/src/Libraries/DSOffice/DSOfficeImages.resx index a1d53597224..412f23db397 100644 --- a/src/Libraries/DSOffice/DSOfficeImages.resx +++ b/src/Libraries/DSOffice/DSOfficeImages.resx @@ -120,159 +120,186 @@ - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAATElEQVRYR+3QsQkAIAxE0Uwr - juBsLqeWKc5CrjHwH6T5hXAGAOBmzL7yue2ZesRpeHa+ruVzWz1qhdPqUSucVo9a4bR61AqnAcCnIjZ8 - fvMh4IFW4wAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAABMSURBVFhH7dCxCQAgDETRTCuO4Gwup5YpzkKuMfAf + pPmFcAYA4GbMvvK57Zl6xGl4dr6u5XNbPWqF0+pRK5xWj1rhtHrUCqcBwKciNnx+8yHggVbjAAAAAElF + TkSuQmCC - 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 - yngTyQAAAABJRU5ErkJggg== - + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGCSURBVFhH7VOxTgJBFLxP4FMolARBFAUUY2FnqaUl + tra2Jla2XmdLa6KJ8Qv4DTs/Yd3ZnTk3xkT23cVQ3CQTdt8+ZuYtS9GixUbj/XTuMnnJrzYDiHL5Jxjg + s9EQhgBdhihZrofcAPxEiFUawjlnuxVLAMCvOwzx5s1LT2Dl2WHLesgN8JMfry/R+hsLtq8HiHCZDW+m + yYX8d2ENALPoWcH2KC0BYBY9K9j/EbkBvNkiekbgDfDIhpwA3u/Mc+mJ1w6Udd5QQGYAXT1ChNf+3wEw + +b1nl6VmAtQlpWz4TTCXlLIhFXqYHLib/ZG7OxyH/fPJsbsd74Xa42zino6m1RmIOnooZUMqdt7vByME + Qe1isBPq2IPL+cwNt7fCGcJMe72wppQNCiBz7UGYw0STqg9hrke7oY4apWyQmYS1FzE1zHAb2OMnuBoO + QjCcoUYpG2QEc02ryTQlzLFWL/oUCKSUDRIBMRF+Bk2Ga9fjS/uwVw9IKRtSYSsp1aLFpqIovgAL6lit + yngTyQAAAABJRU5ErkJggg== + - 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 - gv64uvoLFK94NiazvjoAAAAASUVORK5CYII= - + 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 + gv64uvoLFK94NiazvjoAAAAASUVORK5CYII= + - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m - dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFnSURBVFhH7ZTBbYNAEEUpgRJSgktIjpFycAmUkBLo - wFIacAkuAaUCzjmlhJTg/Lf6g5a1rBgMipTwpC9mht2Z2V3YamNj4xbeX54fpFepxXbs0T5x3u+IpQkC - m5jd+ShJLX1KeyuKnSSKNI6hk6cxryNmdz5KQoHWbkI+TfV+VztMnKYumrkLJWKbRw0EitMAK01bb58j - QU0adC9KxGpYLaseye9HOySbhjq7y6CEnH1KLA1bbP8o5ceQdsDuH+csbP4O/6eBp7ePc8ihRNlAOU7P - g9RZwy05mUhYcm0HYjxFsa35t2IkLPmpAZB9lHpp/s0YCVVvJw3/eN6AzEZK21w0UFvswnBfTCISqsCe - oiJdsxh+0tiXdMCP8TmKzf8O8oQq0krAiiGKHz1k3QaAYlQ2FO/9KrF6A6Ci0UQvjc42Hy97uW+gRIU5 - jouk+XjZy/0FtxLj9VzuHpgqz1vmJtzYWI+q+gZ05qhhEkqOhwAAAABJRU5ErkJggg== - + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFnSURBVFhH7ZTBbYNAEEUpgRJSgktIjpFycAmUkBLo + wFIacAkuAaUCzjmlhJTg/Lf6g5a1rBgMipTwpC9mht2Z2V3YamNj4xbeX54fpFepxXbs0T5x3u+IpQkC + m5jd+ShJLX1KeyuKnSSKNI6hk6cxryNmdz5KQoHWbkI+TfV+VztMnKYumrkLJWKbRw0EitMAK01bb58j + QU0adC9KxGpYLaseye9HOySbhjq7y6CEnH1KLA1bbP8o5ceQdsDuH+csbP4O/6eBp7ePc8ihRNlAOU7P + g9RZwy05mUhYcm0HYjxFsa35t2IkLPmpAZB9lHpp/s0YCVVvJw3/eN6AzEZK21w0UFvswnBfTCISqsCe + oiJdsxh+0tiXdMCP8TmKzf8O8oQq0krAiiGKHz1k3QaAYlQ2FO/9KrF6A6Ci0UQvjc42Hy97uW+gRIU5 + jouk+XjZy/0FtxLj9VzuHpgqz1vmJtzYWI+q+gZ05qhhEkqOhwAAAABJRU5ErkJggg== + - iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAEhklEQVR4Xu2aT4tURxTF5yPM - R/Aj5CP4BQSXWQpushKXwZUbwax0FQQXBhJmFZy4cSGK4kZcyISIiUpiSxLUAcmo0cQ/I+291ec9am6d - rumefthvus8PDjRd5753OQX96lX1ihBCCCGEEEIIIYQQQgghhBBCCCGEEEJMwtdXvhpOI5Ql2HhNKEuw - 8ZpQlmDjUbD2H9Z8TShLsPGaUJZg4zWhLMHGo2DtP6z5mlCWYOM1oSzBxmtCWYKNR8Haf1jzNaEswcZr - QlmCjdeEsgQbj4K1/7Dma0JZgo3XhLIEG68JZQk2HgVr/2HN14SyBBuvCWUJNl4TyhJsPApWIYQQQgjR - T2zJdnI3wVrAvFGwFjBvFKwFzBsFa/9hzUfBWsC8UbAWMG8UrAXMGwVr/2HNR8FawLxR7hsOh1+YTprW - Tdddz99sDlxPXv312y/P7tz4/udz51gtI/qYYF1eLORV03HTwDQp7vWaVVxG7AUL8DDC3CteexiXE9Ng - wZ1JEZbcMp03nQjy73yMcQaXFZNggV0Y5dby2rRm+tJ0aBe5x71ek3MBlxc1PKhRXi2PTEdNLOyavMZr - czQJNSwgf3DmXDWxcKeRXyPnOG63WLAlXBSsBT727e1vzn74+P5/hDR89fbl5uWHF9ca2Vcs3EO5Z5zM - d9fUsGU60Nx3N6UG9wOs+ShYC3zs8dbvG6N8hsPtj9vvrv1x+ccQ4iwT4M+F/JmQfopif0ypwf0Aaz4K - 1oLTN0+cRjCJB8/v3SIhzjIB7j1rylllPUahxcXGwsh/+zdNRdAdya/dsJjPgr1gYfi2QoOv51l4Xciv - 3bCO2wsLwx+MDcdMLLwu5Ndu2MLtlxsLwvd6clhwXaoFLSw3lsPBURwJf3FioXWp/DlwEG0sLx7CKIuE - r9dZaF0qfydYnAlgS7goWHdgIfgef+Ld9tvXbBnpsmEW5jTL0Ebt+wA7O4hCm/2HNR8FawHySLAAXTaU - h9iKeaNCTQvrMQot9h/WfBSsBf+9f9Ougjae3r46QYitmDcq858yNQxYj1FocbGxMPId0C424MYp35jT - zmiDheEnXw3+Gz3Jvv+0ivtBOinLsUDyo8dLJhbiLPJrNgxwW9FgocSzgC7fiP3IMucIbityLJh2S9rw - n4suJsGvkf/0bOB2ImLhtO8EYNZJiOE7i7myYUu4KFgLcs/Nx1d+QlAJP5x59M/DO/aRBTx2Geo1Xmse - RvoJyu87TqnB/QBrPgrWguiLkwB8D8cPVXaskPLQ/RTND3P8jdrGIvH/RUfifZnQYv9hzUfBWsC8F3/9 - 4bv8jDjg+zm+qln788Xg7pN//77vZ8hpJICXPN9v8l3X/Bkz9Ilm986FFpcTy8hDG/cHrUnw2vbvif7Z - tGMSDK2IdsNCOmDyMCf5m6J7/A+86Z8PEftekzALFpZPhr85e8i5/DsaesR8moR5Y4FrEuaNBa5JmDcW - uCZh3ljgmoR5Y4FrEuaNBa5JmDcWeJwEnZx9biz0ZhIU/rzwScBHIYQQQgghhBBCCCGEEEIIIcQUrKx8 - AuDviEpOlLH+AAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAASGSURBVHhe7ZpPi1RHFMXnI8xH8CPkI/gFBJdZCm6y + EpfBlRvBrHQVBBcGEmYVnLhxIYriRlzIhIiJSmJLEtQByajRxD8j7b3V5z1qbp2u6Z5+2G+6zw8ONF3n + vnc5Bf3qVfWKEEIIIYQQQgghhBBCCCGEEEIIIYQQQkzC11e+Gk4jlCXYeE0oS7DxmlCWYONRsPYf1nxN + KEuw8ZpQlmDjNaEswcajYO0/rPmaUJZg4zWhLMHGa0JZgo1Hwdp/WPM1oSzBxmtCWYKN14SyBBuPgrX/ + sOZrQlmCjdeEsgQbrwllCTYeBWv/Yc3XhLIEG68JZQk2XhPKEmw8ClYhhBBCCNFPbMl2cjfBWsC8UbAW + MG8UrAXMGwVr/2HNR8FawLxRsBYwbxSsBcwbBWv/Yc1HwVrAvFHuGw6HX5hOmtZN113P32wOXE9e/fXb + L8/u3Pj+53PnWC0j+phgXV4s5FXTcdPANCnu9ZpVXEbsBQvwMMLcK157GJcT02DBnUkRltwynTedCPLv + fIxxBpcVk2CBXRjl1vLatGb60nRoF7nHvV6TcwGXFzU8qFFeLY9MR00s7Jq8xmtzNAk1LCB/cOZcNbFw + p5FfI+c4brdYsCVcFKwFPvbt7W/Ofvj4/n+ENHz19uXm5YcX1xrZVyzcQ7lnnMx319SwZTrQ3Hc3pQb3 + A6z5KFgLfOzx1u8bo3yGw+2P2++u/XH5xxDiLBPgz4X8mZB+imJ/TKnB/QBrPgrWgtM3T5xGMIkHz+/d + IiHOMgHuPWvKWWU9RqHFxcbCyH/7N01F0B3Jr92wmM+CvWBh+LZCg6/nWXhdyK/dsI7bCwvDH4wNx0ws + vC7k127Ywu2XGwvC93pyWHBdqgUtLDeWw8FRHAl/cWKhdan8OXAQbSwvHsIoi4Sv11loXSp/J1icCWBL + uChYd2Ah+B5/4t3229dsGemyYRbmNMvQRu37ADs7iEKb/Yc1HwVrAfJIsABdNpSH2Ip5o0JNC+sxCi32 + H9Z8FKwF/71/066CNp7evjpBiK2YNyrznzI1DFiPUWhxsbEw8h3QLjbgxinfmNPOaIOF4SdfDf4bPcm+ + /7SK+0E6KcuxQPKjx0smFuIs8ms2DHBb0WChxLOALt+I/cgy5whuK3IsmHZL2vCfiy4mwa+R//Rs4HYi + YuG07wRg1kmI4TuLubJhS7goWAtyz83HV35CUAk/nHn0z8M79pEFPHYZ6jVeax5G+gnK7ztOqcH9AGs+ + CtaC6IuTAHwPxw9VdqyQ8tD9FM0Pc/yN2sYi8f9FR+J9mdBi/2HNR8FawLwXf/3hu/yMOOD7Ob6qWfvz + xeDuk3//vu9nyGkkgJc832/yXdf8GTP0iWb3zoUWlxPLyEMb9wetSfDa9u+J/tm0YxIMrYh2w0I6YPIw + J/mbonv8D7zpnw8R+16TMAsWlk+Gvzl7yLn8Oxp6xHyahHljgWsS5o0FrkmYNxa4JmHeWOCahHljgWsS + 5o0FrkmYNxZ4nASdnH1uLPRmEhT+vPBJwEchhBBCCCGEEEIIIYQQQgghxBSsrHwC4O+ISk6Usf4AAAAA + SUVORK5CYII= + - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m - dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAErSURBVFhH7ZSxakIxFIbvI/gIPsp9AcHR0dGpszg5 - uukb2EE6OpYihYIIossdREGXgha6tLWDIAXL9f/lROIl1yHG7XzwQXKSnBNzYyJFUZRr1Ae11NY3xr4X - dhKTyCfGvuIFjq9plNBFLE3TAoz7i95ja9ho5c2TUDikcBeSmUgYK8i0+8ACMIFjWIElkW3GOBZmE65j - XH7Nxz/7783zqv8khUtsG2UT53X22iAg+RY+sHCOHNvK9PAgOXEVtg3z33cdI5Nbx30qmPkEvAt8gO72 - CXjJOjD7q40cS2R6eJC8DHfQdQ8Y41hVpt+G6xjZnn6MXg7/hz8U4pE3ks/J6/r3fSaxN5iYh8leGxQU - iSEfHhakbMcyxna498AH3YQBxduwKF1FUTJE0REZ3Pv1glXtwQAAAABJRU5ErkJggg== - + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAErSURBVFhH7ZSxakIxFIbvI/gIPsp9AcHR0dGpszg5 + uukb2EE6OpYihYIIossdREGXgha6tLWDIAXL9f/lROIl1yHG7XzwQXKSnBNzYyJFUZRr1Ae11NY3xr4X + dhKTyCfGvuIFjq9plNBFLE3TAoz7i95ja9ho5c2TUDikcBeSmUgYK8i0+8ACMIFjWIElkW3GOBZmE65j + XH7Nxz/7783zqv8khUtsG2UT53X22iAg+RY+sHCOHNvK9PAgOXEVtg3z33cdI5Nbx30qmPkEvAt8gO72 + CXjJOjD7q40cS2R6eJC8DHfQdQ8Y41hVpt+G6xjZnn6MXg7/hz8U4pE3ks/J6/r3fSaxN5iYh8leGxQU + iSEfHhakbMcyxna498AH3YQBxduwKF1FUTJE0REZ3Pv1glXtwQAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAALWSURBVHhe7doxbhRBEIVhH8FH8BE4AkfwEQgJCRER + oTNSZw44AMQOfQE4AhmhRQQCoaW6eWOZqrc9u8KzO5b/T3oC0a/wUI2WEfIJAAAAAAAAAAAAAAAAAOzi + 9fXLzT7RWOfOR9FY585H0VjnznNUXT/38KNorHPno2isc+ejaKxz5zmqrp97+FE01rnzUTTWufNRNNa5 + 8xxV1889/Cga69z5KBrr3PkoGuvceY6q6+cefhSNde58FI117nwUjXXuPEfV9XMPP4rGOnc+isY6dz6K + xjp3nqMq8ARsNpvn+ikOLZb/ItJc6ZdwKLH0afmTD5FTHWNJsei8/MmnCJewpFjwtuVPHs8lxCvb27mo + WrhujqqF6+ao+o9Y7NzyJ4/jEtwfPEfVwnVzVC1cN0fVO7HQXZff3EbONLpe7g+eo2rhujmqFq6bo2oX + y9x5+b9+//wePzzTKP5XLHPfv/ks/6HEMln+scQyWf6xxDJZ/rHEMln+scQyn9by3etfjqqF6+aoWrju + zZfrj3/3Oq+9ar7/fHnpfp8WfZn1cw+fo2rhujmqFrn3kMtv0ZdZP/fwOaoWrpujanG/s8/yw+3c8lv0 + ZTAnFso/uMcSyzzva90Ny39osdDTSPtfyzksfymx2LlLYPlLiwVvuwSWfyix6HwJT2P57hUuR9XCdXNU + bQs+i9x954LrXty8ufj24/br9J6vauFmc1RdP/fwOaoWrpujaruAV5GmX4LrtrRLmN7z+6CRZ1xUXT/3 + 8DmqFq6bo2q7gPsfL1eum6PRwnVzVEUTC28fPxnfSHUosezp4yfjEg4hFj16z3+nGpYQC3YfP+0V8ypy + rhqWEkuePn5Y+jHEwtsFsPRt3CtcjqqF6+aoWrhujqqF6+aoun7u4XNULVw3R9XCdXNULVw3R9X1cw+f + o2rhujmqFq6bo2rhujmqAgAAAAAAAAAAAAAAAAAAAACSk5M/qVE78xNHtssAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADISURBVFhH7ZGxDcIwEEUzQkZhFEagpEyJqCjTMULW + QJSIioYFKCjoGcH8T+4sywQEjmOae9Ip9o+Tp/xUhmEYn1jtly6c1Iz7JMKX6ItSMu7/gnNuIcvyQN5h + yBlTS/wbqG+jI9FXGYQqV5rnwRJAFss7uTU9lPVOzzh5XC15l13vF/5rD/fxucmAr+m1nnK1EwhrjDaQ + T64VhjWGGWRzCrluD+v2dDvu5Njgs9mhnJ/Mq0RlgZi1bzEzifIyVOOYzDAMw3ilqh4Z50OfJiOXDQAA + AABJRU5ErkJggg== + - iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAC1klEQVR4Xu3aMW4UQRCFYR/B - R/AROAJH8BEICQkREaEzUmcOOADEDn0BOAIZoUUEAqGlunljmaq3PbvCszuW/096AtGv8FCNlhHyCQAA - AAAAAAAAAAAAAADs4vX1y80+0VjnzkfRWOfOR9FY585zVF0/9/CjaKxz56NorHPno2isc+c5qq6fe/hR - NNa581E01rnzUTTWufMcVdfPPfwoGuvc+Sga69z5KBrr3HmOquvnHn4UjXXufBSNde58FI117jxH1fVz - Dz+Kxjp3PorGOnc+isY6d56jKvAEbDab5/opDi2W/yLSXOmXcCix9Gn5kw+RUx1jSbHovPzJpwiXsKRY - 8LblTx7PJcQr29u5qFq4bo6qhevmqPqPWOzc8ieP4xLcHzxH1cJ1c1QtXDdH1Tux0F2X39xGzjS6Xu4P - nqNq4bo5qhaum6NqF8vcefm/fv/8Hj880yj+Vyxz37/5LP+hxDJZ/rHEMln+scQyWf6xxDJZ/rHEMp/W - 8t3rX46qhevmqFq47s2X649/9zqvvWq+/3x56X6fFn2Z9XMPn6Nq4bo5qha595DLb9GXWT/38DmqFq6b - o2pxv7PP8sPt3PJb9GUwJxbKP7jHEss872vdDct/aLHQ00j7X8s5LH8psdi5S2D5S4sFb7sEln8oseh8 - CU9j+e4VLkfVwnVzVG0LPovcfeeC617cvLn49uP26/Ser2rhZnNUXT/38DmqFq6bo2q7gFeRpl+C67a0 - S5je8/ugkWdcVF0/9/A5qhaum6Nqu4D7Hy9Xrpuj0cJ1c1RFEwtvHz8Z30h1KLHs6eMn4xIOIRY9es9/ - pxqWEAt2Hz/tFfMqcq4alhJLnj5+WPoxxMLbBbD0bdwrXI6qhevmqFq4bo6qhevmqLp+7uFzVC1cN0fV - wnVzVC1cN0fV9XMPn6Nq4bo5qhaum6Nq4bo5qgIAAAAAAAAAAAAAAAAAAAAAkpOTP6lRO/MTR7bLAAAA - AElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAALWSURBVHhe7doxbhRBEIVhH8FH8BE4AkfwEQgJCRER + oTNSZw44AMQOfQE4AhmhRQQCoaW6eWOZqrc9u8KzO5b/T3oC0a/wUI2WEfIJAAAAAAAAAAAAAAAAAOzi + 9fXLzT7RWOfOR9FY585H0VjnznNUXT/38KNorHPno2isc+ejaKxz5zmqrp97+FE01rnzUTTWufNRNNa5 + 8xxV1889/Cga69z5KBrr3PkoGuvceY6q6+cefhSNde58FI117nwUjXXuPEfV9XMPP4rGOnc+isY6dz6K + xjp3nqMq8ARsNpvn+ikOLZb/ItJc6ZdwKLH0afmTD5FTHWNJsei8/MmnCJewpFjwtuVPHs8lxCvb27mo + WrhujqqF6+ao+o9Y7NzyJ4/jEtwfPEfVwnVzVC1cN0fVO7HQXZff3EbONLpe7g+eo2rhujmqFq6bo2oX + y9x5+b9+//wePzzTKP5XLHPfv/ks/6HEMln+scQyWf6xxDJZ/rHEMln+scQyn9by3etfjqqF6+aoWrju + zZfrj3/3Oq+9ar7/fHnpfp8WfZn1cw+fo2rhujmqFrn3kMtv0ZdZP/fwOaoWrpujanG/s8/yw+3c8lv0 + ZTAnFso/uMcSyzzva90Ny39osdDTSPtfyzksfymx2LlLYPlLiwVvuwSWfyix6HwJT2P57hUuR9XCdXNU + bQs+i9x954LrXty8ufj24/br9J6vauFmc1RdP/fwOaoWrpujaruAV5GmX4LrtrRLmN7z+6CRZ1xUXT/3 + 8DmqFq6bo2q7gPsfL1eum6PRwnVzVEUTC28fPxnfSHUosezp4yfjEg4hFj16z3+nGpYQC3YfP+0V8ypy + rhqWEkuePn5Y+jHEwtsFsPRt3CtcjqqF6+aoWrhujqqF6+aoun7u4XNULVw3R9XCdXNULVw3R9X1cw+f + o2rhujmqFq6bo2rhujmqAgAAAAAAAAAAAAAAAAAAAACSk5M/qVE78xNHtssAAAAASUVORK5CYII= + - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m - dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADISURBVFhH7ZGxDcIwEEUzQkZhFEagpEyJqCjTMULW - QJSIioYFKCjoGcH8T+4sywQEjmOae9Ip9o+Tp/xUhmEYn1jtly6c1Iz7JMKX6ItSMu7/gnNuIcvyQN5h - yBlTS/wbqG+jI9FXGYQqV5rnwRJAFss7uTU9lPVOzzh5XC15l13vF/5rD/fxucmAr+m1nnK1EwhrjDaQ - T64VhjWGGWRzCrluD+v2dDvu5Njgs9mhnJ/Mq0RlgZi1bzEzifIyVOOYzDAMw3ilqh4Z50OfJiOXDQAA - AABJRU5ErkJggg== - + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADISURBVFhH7ZGxDcIwEEUzQkZhFEagpEyJqCjTMULW + QJSIioYFKCjoGcH8T+4sywQEjmOae9Ip9o+Tp/xUhmEYn1jtly6c1Iz7JMKX6ItSMu7/gnNuIcvyQN5h + yBlTS/wbqG+jI9FXGYQqV5rnwRJAFss7uTU9lPVOzzh5XC15l13vF/5rD/fxucmAr+m1nnK1EwhrjDaQ + T64VhjWGGWRzCrluD+v2dDvu5Njgs9mhnJ/Mq0RlgZi1bzEzifIyVOOYzDAMw3ilqh4Z50OfJiOXDQAA + AABJRU5ErkJggg== + \ No newline at end of file diff --git a/src/Libraries/DSOffice/Excel.cs b/src/Libraries/DSOffice/Excel.cs index c568ad53b2f..905832407ae 100644 --- a/src/Libraries/DSOffice/Excel.cs +++ b/src/Libraries/DSOffice/Excel.cs @@ -275,28 +275,28 @@ public static WorkBook SaveAsExcelWorkbook(WorkBook workbook, string filename) [IsVisibleInDynamoLibrary(false)] public static object[][] ReadFromFile(FileInfo file, string sheetName, bool readAsStrings = false, bool showExcel = true) { - object[][] data; - - if(!showExcel) - { - ExcelInterop.ShowOnStartup = false; - } - WorkBook wb = WorkBook.ReadExcelFile(file.FullName); + object[][] data; + + if (!showExcel) + { + ExcelInterop.ShowOnStartup = false; + } + WorkBook wb = WorkBook.ReadExcelFile(file.FullName); WorkSheet ws = wb.GetWorksheetByName(sheetName); if (readAsStrings) { - data = ws.GetData(true); + data = ws.GetData(true); } else { - data = ws.Data; + data = ws.Data; } - if(!showExcel) + if (!showExcel) { - wb.CloseHidden(); - ExcelInterop.ShowOnStartup = true; + wb.CloseHidden(); + ExcelInterop.ShowOnStartup = true; } - + return data; } @@ -325,10 +325,15 @@ public static object[][] Read(string filePath, string sheetName) /// office,excel,spreadsheet [IsVisibleInDynamoLibrary(false)] public static object[][] WriteToFile(string filePath, string sheetName, int startRow, int startCol, object[][] data, bool overWrite = false) + { + return WriteData(filePath, sheetName, startRow, startCol, data, overWrite); + } + + internal static object[][] WriteData(string filePath, string sheetName, int startRow, int startCol, object[][] data, bool overWrite = false, bool writeAsString = false) { WorkBook wb = new WorkBook(filePath); WorkSheet ws = new WorkSheet(wb, sheetName, overWrite); - ws = ws.WriteData(startRow, startCol, data); + ws = ws.WriteData(startRow, startCol, data, writeAsString); return ws.Data; } } @@ -522,8 +527,9 @@ internal WorkSheet(Worksheet ws, WorkBook wb) /// /// /// + /// /// - internal WorkSheet WriteData(int startRow, int startColumn, object[][] data) + internal WorkSheet WriteData(int startRow, int startColumn, object[][] data, bool writeAsString = false) { startRow = Math.Max(0, startRow); startColumn = Math.Max(0, startColumn); @@ -537,6 +543,8 @@ internal WorkSheet WriteData(int startRow, int startColumn, object[][] data) var c1 = (Range)ws.Cells[startRow + 1, startColumn + 1]; var c2 = (Range)ws.Cells[startRow + numRows, startColumn + numColumns]; var range = ws.Range[c1, c2]; + if(writeAsString) + range.NumberFormat = "@"; range.Value = rangeData; wb.Save(); @@ -833,9 +841,33 @@ public static object[][] ImportExcel(FileInfo file, string sheetName, bool readA /// /// Data written to the spreadsheet. /// office,excel,spreadsheet + [Obsolete("Use ExportToExcel instead.")] public static object[][] ExportExcel(string filePath, string sheetName, int startRow, int startCol, object[][] data, bool overWrite = false) { - return Excel.WriteToFile(filePath, sheetName, startRow, startCol, data, overWrite); + return Excel.WriteData(filePath, sheetName, startRow, startCol, data, overWrite); + } + + /// + /// Write data to a Microsoft Excel spreadsheet. Data is written by row + /// with sublists to be written in successive rows. Rows and columns are + /// zero-indexed; for example, the value in the data list at [0,0] will + /// be written to cell A1. Null values and empty lists are written to Excel + /// as empty cells. This node requires Microsoft Excel to be installed. + /// + /// File path to the Microsoft Excel spreadsheet. + /// Name of the worksheet to write data to. + /// Start row for writing data. Enter 0 for Row 1, 1 for Row 2, etc. + /// + /// Start column for writing data. Enter 0 for Column A, 1 for Column B, etc. + /// + /// Data to write to the spreadsheet. + /// + /// Toggle to switch between writing Excel file as strings. + /// Data written to the spreadsheet. + /// office,excel,spreadsheet + public static object[][] ExportToExcel(string filePath, string sheetName, int startRow, int startCol, object[][] data, bool overWrite = false, bool writeAsString = false) + { + return Excel.WriteData(filePath, sheetName, startRow, startCol, data, overWrite, writeAsString); } } } diff --git a/src/LibraryViewExtension/web/library/layoutSpecs.json b/src/LibraryViewExtension/web/library/layoutSpecs.json index db28d332e79..878b04e991b 100644 --- a/src/LibraryViewExtension/web/library/layoutSpecs.json +++ b/src/LibraryViewExtension/web/library/layoutSpecs.json @@ -1032,7 +1032,7 @@ "path": "DSOffice.DSOffice.Data.ImportExcel" }, { - "path": "DSOffice.DSOffice.Data.ExportExcel" + "path": "DSOffice.DSOffice.Data.ExportToExcel" }, { "path": "DSOffice.DSOffice.Data.ImportCSV" diff --git a/src/LibraryViewExtensionMSWebBrowser/web/library/layoutSpecs.json b/src/LibraryViewExtensionMSWebBrowser/web/library/layoutSpecs.json index ded9aa18164..14d48bc46bb 100644 --- a/src/LibraryViewExtensionMSWebBrowser/web/library/layoutSpecs.json +++ b/src/LibraryViewExtensionMSWebBrowser/web/library/layoutSpecs.json @@ -1028,7 +1028,7 @@ "path": "DSOffice.DSOffice.Data.ImportExcel" }, { - "path": "DSOffice.DSOffice.Data.ExportExcel" + "path": "DSOffice.DSOffice.Data.ExportToExcel" }, { "path": "DSOffice.DSOffice.Data.ImportCSV" diff --git a/test/Libraries/DynamoMSOfficeTests/ExcelTests.cs b/test/Libraries/DynamoMSOfficeTests/ExcelTests.cs index ded1caf9eaa..2c8d41cdc21 100644 --- a/test/Libraries/DynamoMSOfficeTests/ExcelTests.cs +++ b/test/Libraries/DynamoMSOfficeTests/ExcelTests.cs @@ -1180,6 +1180,40 @@ public void TestOverwriteToSingleSheetExcel() Assert.IsTrue(wb.WorkSheets.Length == 1); } + + [Test, Category("ExcelTest")] + public void CanExportToExcelAsString() + { + // Arrange + string openPath = Path.Combine(TestDirectory, @"core\excel\ExportToExcelAsString.dyn"); + ViewModel.OpenCommand.Execute(openPath); + + var filename = ViewModel.Model.CurrentWorkspace.FirstNodeFromWorkspace(); + + // Act + // remap the filename as Excel requires an absolute path + filename.Value = filename.HintPath.Replace(@"..\..\..\test", TestDirectory); + + ViewModel.HomeSpace.Run(); + + // Codeblock that holds the data that will be exported (value = 12) + var dataCodeBlock = ViewModel.Model.CurrentWorkspace.NodeFromWorkspace("8070c45660c349d5bbc143febd22cfcf") as CodeBlockNodeModel; + var wb = Excel.ReadExcelFile(filename.Value); + + // Running the graph exports the value 12 to excel, + // getting that value here so we can check that the value has been converted to a string. + var excelExportDataType = wb.WorkSheets + .FirstOrDefault() + .Data + .FirstOrDefault() + .FirstOrDefault() + .GetType(); + + // Assert + Assert.AreEqual(typeof(Int64), dataCodeBlock.CachedValue.Data.GetType()); + Assert.AreEqual(typeof(string), excelExportDataType); + } + #endregion #region Saving diff --git a/test/ViewExtensionLibraryTests/resources/libraryItems.json b/test/ViewExtensionLibraryTests/resources/libraryItems.json index 93d3924a399..dd4f6f8439f 100644 --- a/test/ViewExtensionLibraryTests/resources/libraryItems.json +++ b/test/ViewExtensionLibraryTests/resources/libraryItems.json @@ -5649,9 +5649,9 @@ "keywords": "" }, { - "fullyQualifiedName": "DSOffice.Data.ExportExcel", - "iconUrl": "http://localhost/icons/DSOffice.Data.ExportExcel.Small?path=DSOffice.dll", - "contextData": "DSOffice.Data.ExportExcel@string,string,int,int,var[][],bool", + "fullyQualifiedName": "DSOffice.Data.ExportToExcel", + "iconUrl": "http://localhost/icons/DSOffice.Data.ExportToExcel.Small?path=DSOffice.dll", + "contextData": "DSOffice.Data.ExportToExcel@string,string,int,int,var[][],bool,bool", "parameters": null, "itemType": "action", "keywords": "" diff --git a/test/core/excel/ExportToExcelAsString.dyn b/test/core/excel/ExportToExcelAsString.dyn new file mode 100644 index 00000000000..4e8da93c289 --- /dev/null +++ b/test/core/excel/ExportToExcelAsString.dyn @@ -0,0 +1,284 @@ +{ + "Uuid": "0bcbd2b1-8e73-4563-9f92-09e8da643f87", + "IsCustomNode": false, + "Description": null, + "Name": "ExportToExcelAsString", + "ElementResolver": { + "ResolutionMap": {} + }, + "Inputs": [], + "Outputs": [], + "Nodes": [ + { + "ConcreteType": "CoreNodeModels.Input.Filename, CoreNodeModels", + "HintPath": "C:\\Users\\SylvesterKnudsen\\Documents\\GitHub\\StudioLEDynamo\\test\\core\\excel\\WriteFile.xlsx", + "InputValue": "..\\Documents\\GitHub\\StudioLEDynamo\\test\\core\\excel\\WriteFile.xlsx", + "NodeType": "ExtensionNode", + "Id": "29dc0142e4344db5a14bf0a9683abe87", + "Inputs": [], + "Outputs": [ + { + "Id": "97de3aa417664e59b0c93a1583b78709", + "Name": "", + "Description": "Filename", + "UsingDefaultValue": false, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + } + ], + "Replication": "Disabled", + "Description": "Allows you to select a file on the system to get its filename" + }, + { + "ConcreteType": "Dynamo.Graph.Nodes.CodeBlockNodeModel, DynamoCore", + "NodeType": "CodeBlockNode", + "Code": "\"Sheet1\";\n0;\ntrue;", + "Id": "6ed5a3c91ee4493f8ae3bb508a17ba69", + "Inputs": [], + "Outputs": [ + { + "Id": "5ddc9ead1589460983fc81caf6884fb3", + "Name": "", + "Description": "Value of expression at line 1", + "UsingDefaultValue": false, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + }, + { + "Id": "aad5d0fc5856401da307b196f7556955", + "Name": "", + "Description": "Value of expression at line 2", + "UsingDefaultValue": false, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + }, + { + "Id": "4b78d9136b854d3cbd7faa86e7d7ce46", + "Name": "", + "Description": "Value of expression at line 3", + "UsingDefaultValue": false, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + } + ], + "Replication": "Disabled", + "Description": "Allows for DesignScript code to be authored directly" + }, + { + "ConcreteType": "Dynamo.Graph.Nodes.ZeroTouch.DSFunction, DynamoCore", + "NodeType": "FunctionNode", + "FunctionSignature": "DSOffice.Data.ExportToExcel@string,string,int,int,var[][],bool,bool", + "Id": "f53cbcbb212249d7813b0706e87f4658", + "Inputs": [ + { + "Id": "8467a58d02a04631b3238f286b92cbc9", + "Name": "filePath", + "Description": "File path to the Microsoft Excel spreadsheet.\n\nstring", + "UsingDefaultValue": false, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + }, + { + "Id": "94c6b99a244342b3a5c7088dfe6242bb", + "Name": "sheetName", + "Description": "Name of the worksheet to write data to.\n\nstring", + "UsingDefaultValue": false, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + }, + { + "Id": "2a84bf16824347078ab66d6d9419a23f", + "Name": "startRow", + "Description": "Start row for writing data. Enter 0 for Row 1, 1 for Row 2, etc.\n\nint", + "UsingDefaultValue": false, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + }, + { + "Id": "6094c85f8f84400bb58f434e0d91c6bf", + "Name": "startCol", + "Description": "Start column for writing data. Enter 0 for Column A, 1 for Column B, etc.\n\nint", + "UsingDefaultValue": false, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + }, + { + "Id": "cef0308258574561aff4ec753948a948", + "Name": "data", + "Description": "Data to write to the spreadsheet.\n\nvar[][]", + "UsingDefaultValue": false, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + }, + { + "Id": "a29f108484764b34841351a7c3e296fd", + "Name": "overWrite", + "Description": "bool\nDefault value : false", + "UsingDefaultValue": true, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + }, + { + "Id": "f4ce7ecd0f5345b1877a20f2aea57563", + "Name": "writeAsString", + "Description": "Toggle to switch between writing Excel file as strings.\n\nbool\nDefault value : false", + "UsingDefaultValue": true, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + } + ], + "Outputs": [ + { + "Id": "c962199304794b35857e2a9a640ba711", + "Name": "data", + "Description": "Data written to the spreadsheet.", + "UsingDefaultValue": false, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + } + ], + "Replication": "Auto", + "Description": "Write data to a Microsoft Excel spreadsheet. Data is written by row with sublists to be written in successive rows. Rows and columns are zero-indexed; for example, the value in the data list at [0,0] will be written to cell A1. Null values and empty lists are written to Excel as empty cells. This node requires Microsoft Excel to be installed.\n\nData.ExportToExcel (filePath: string, sheetName: string, startRow: int, startCol: int, data: var[][], overWrite: bool = false, writeAsString: bool = false): var[][]" + }, + { + "ConcreteType": "Dynamo.Graph.Nodes.CodeBlockNodeModel, DynamoCore", + "NodeType": "CodeBlockNode", + "Code": "12;", + "Id": "8070c45660c349d5bbc143febd22cfcf", + "Inputs": [], + "Outputs": [ + { + "Id": "bffcb369095c4d11ade0f588d04e5583", + "Name": "", + "Description": "Value of expression at line 1", + "UsingDefaultValue": false, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + } + ], + "Replication": "Disabled", + "Description": "Allows for DesignScript code to be authored directly" + } + ], + "Connectors": [ + { + "Start": "97de3aa417664e59b0c93a1583b78709", + "End": "8467a58d02a04631b3238f286b92cbc9", + "Id": "c5ffe00350d146d1980a2a947b80c63e" + }, + { + "Start": "5ddc9ead1589460983fc81caf6884fb3", + "End": "94c6b99a244342b3a5c7088dfe6242bb", + "Id": "65b478928e2249c3b60de476ca441c75" + }, + { + "Start": "aad5d0fc5856401da307b196f7556955", + "End": "2a84bf16824347078ab66d6d9419a23f", + "Id": "e77510b77ab64d6f977dac9a172e2318" + }, + { + "Start": "aad5d0fc5856401da307b196f7556955", + "End": "6094c85f8f84400bb58f434e0d91c6bf", + "Id": "c7bb8c99000148b1b6b5e685aed47b11" + }, + { + "Start": "4b78d9136b854d3cbd7faa86e7d7ce46", + "End": "a29f108484764b34841351a7c3e296fd", + "Id": "d621e99b27b44d848e576da57056f794" + }, + { + "Start": "4b78d9136b854d3cbd7faa86e7d7ce46", + "End": "f4ce7ecd0f5345b1877a20f2aea57563", + "Id": "c1b138f5b97c47b28f03906709295c6f" + }, + { + "Start": "bffcb369095c4d11ade0f588d04e5583", + "End": "cef0308258574561aff4ec753948a948", + "Id": "9e019e4b16e7445a8ca861fbc6b31061" + } + ], + "Dependencies": [], + "NodeLibraryDependencies": [], + "Bindings": [], + "View": { + "Dynamo": { + "ScaleFactor": 1.0, + "HasRunWithoutCrash": true, + "IsVisibleInDynamoLibrary": true, + "Version": "2.11.0.3455", + "RunType": "Manual", + "RunPeriod": "1000" + }, + "Camera": { + "Name": "Background Preview", + "EyeX": -17.0, + "EyeY": 24.0, + "EyeZ": 50.0, + "LookX": 12.0, + "LookY": -13.0, + "LookZ": -58.0, + "UpX": 0.0, + "UpY": 1.0, + "UpZ": 0.0 + }, + "NodeViews": [ + { + "ShowGeometry": true, + "Name": "File Path", + "Id": "29dc0142e4344db5a14bf0a9683abe87", + "IsSetAsInput": false, + "IsSetAsOutput": false, + "Excluded": false, + "X": 88.0, + "Y": 239.0 + }, + { + "ShowGeometry": true, + "Name": "Code Block", + "Id": "6ed5a3c91ee4493f8ae3bb508a17ba69", + "IsSetAsInput": false, + "IsSetAsOutput": false, + "Excluded": false, + "X": 151.0, + "Y": 324.0 + }, + { + "ShowGeometry": true, + "Name": "Data.ExportToExcel", + "Id": "f53cbcbb212249d7813b0706e87f4658", + "IsSetAsInput": false, + "IsSetAsOutput": false, + "Excluded": false, + "X": 385.0, + "Y": 237.5 + }, + { + "ShowGeometry": true, + "Name": "Data", + "Id": "8070c45660c349d5bbc143febd22cfcf", + "IsSetAsInput": false, + "IsSetAsOutput": false, + "Excluded": false, + "X": 146.0, + "Y": 455.0 + } + ], + "Annotations": [], + "X": -18.0, + "Y": -50.0, + "Zoom": 1.0 + } +} \ No newline at end of file