1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > java生成XML格式文件 导入MS Project生成甘特图

java生成XML格式文件 导入MS Project生成甘特图

时间:2021-05-25 19:15:00

相关推荐

java生成XML格式文件 导入MS Project生成甘特图

公司需求需要生成如如下图所示的project甘特图,开发语言是java,网上找了很久也没有找到可以利用java生成这种甘特图的方案。退而求其次,改变需求生成可以导入project的xml文件。

首先用project软件制作好图上所示的样例,并导出为xml文件

导出后发现xml文件里有很多很多很多标签,完全看不懂,随便复制几个:

<CurrencyDigits>2</CurrencyDigits><CurrencySymbol>¥</CurrencySymbol><CurrencyCode>CNY</CurrencyCode><CurrencySymbolPosition>0</CurrencySymbolPosition><CalendarUID>3</CalendarUID><DefaultStartTime>09:00:00</DefaultStartTime><DefaultFinishTime>18:00:00</DefaultFinishTime><MinutesPerDay>480</MinutesPerDay><MinutesPerWeek>2400</MinutesPerWeek><DaysPerMonth>20</DaysPerMonth><DefaultTaskType>1</DefaultTaskType><DefaultFixedCostAccrual>3</DefaultFixedCostAccrual><DefaultStandardRate>0</DefaultStandardRate><DefaultOvertimeRate>0</DefaultOvertimeRate><DurationFormat>7</DurationFormat><WorkFormat>2</WorkFormat><EditableActualCosts>0</EditableActualCosts><HonorConstraints>0</HonorConstraints><InsertedProjectsLikeSummary>1</InsertedProjectsLikeSummary><MultipleCriticalPaths>0</MultipleCriticalPaths><NewTasksEffortDriven>0</NewTasksEffortDriven><NewTasksEstimated>1</NewTasksEstimated><SplitsInProgressTasks>1</SplitsInProgressTasks><SpreadActualCost>0</SpreadActualCost><SpreadPercentComplete>0</SpreadPercentComplete><TaskUpdatesResource>1</TaskUpdatesResource><FiscalYearStart>0</FiscalYearStart><WeekStartDay>0</WeekStartDay>

如果想生成xml文件首先一定要弄明白每个标签的含义才可以,在网上找了找到了一个解释标签含义的网站,对照着大概看了一遍

/zh-cn/office/vba/api/project.object

然后发现很多标签都是用不到的,下面是不可省去的核心的最终xml文件和对应的描述:

<?xml version="1.0" encoding="UTF-8"?><Projectxmlns="/project"><!--project名称--><Name>甘特图2.xml</Name><!--标题--><Title>计划更新甘特图</Title><ScheduleFromStart>3</ScheduleFromStart><!--项目总的开始时间--><StartDate>-07-03T09:00:00</StartDate><!--项目总的结束时间--><FinishDate>-08-04T09:00:00</FinishDate><!--使用的日历,和Calendars下Calendar下的UID保持一致--><CalendarUID>3</CalendarUID><!--日历--><Calendars><Calendar><UID>3</UID><Name>全年无休</Name><BaseCalendarUID>-1</BaseCalendarUID><WeekDays><WeekDay><!--周一为1,周二为2,以此类推...--><DayType>1</DayType><DayWorking>1</DayWorking><WorkingTimes><WorkingTime><!--上班时间--><FromTime>08:00:00</FromTime><ToTime>12:00:00</ToTime></WorkingTime><WorkingTime><FromTime>13:00:00</FromTime><ToTime>17:00:00</ToTime></WorkingTime></WorkingTimes></WeekDay><WeekDay><DayType>2</DayType><DayWorking>1</DayWorking><WorkingTimes><WorkingTime><FromTime>08:00:00</FromTime><ToTime>12:00:00</ToTime></WorkingTime><WorkingTime><FromTime>13:00:00</FromTime><ToTime>17:00:00</ToTime></WorkingTime></WorkingTimes></WeekDay><WeekDay><DayType>3</DayType><DayWorking>1</DayWorking><WorkingTimes><WorkingTime><FromTime>08:00:00</FromTime><ToTime>12:00:00</ToTime></WorkingTime><WorkingTime><FromTime>13:00:00</FromTime><ToTime>17:00:00</ToTime></WorkingTime></WorkingTimes></WeekDay><WeekDay><DayType>4</DayType><DayWorking>1</DayWorking><WorkingTimes><WorkingTime><FromTime>08:00:00</FromTime><ToTime>12:00:00</ToTime></WorkingTime><WorkingTime><FromTime>13:00:00</FromTime><ToTime>17:00:00</ToTime></WorkingTime></WorkingTimes></WeekDay><WeekDay><DayType>5</DayType><DayWorking>1</DayWorking><WorkingTimes><WorkingTime><FromTime>08:00:00</FromTime><ToTime>12:00:00</ToTime></WorkingTime><WorkingTime><FromTime>13:00:00</FromTime><ToTime>17:00:00</ToTime></WorkingTime></WorkingTimes></WeekDay><WeekDay><DayType>6</DayType><DayWorking>1</DayWorking><WorkingTimes><WorkingTime><FromTime>08:00:00</FromTime><ToTime>12:00:00</ToTime></WorkingTime><WorkingTime><FromTime>13:00:00</FromTime><ToTime>17:00:00</ToTime></WorkingTime></WorkingTimes></WeekDay><WeekDay><DayType>7</DayType><DayWorking>1</DayWorking><WorkingTimes><WorkingTime><FromTime>08:00:00</FromTime><ToTime>12:00:00</ToTime></WorkingTime><WorkingTime><FromTime>13:00:00</FromTime><ToTime>17:00:00</ToTime></WorkingTime></WorkingTimes></WeekDay></WeekDays></Calendar></Calendars><!--任务--><Tasks><Task><!--可以从1开始累加--><ID>1</ID><!--可以从1开始累加--><UID>1</UID><!--使用的日历,和Calendars下Calendar下的BaseCalendarUID保持一致--><CalendarUID>-1</CalendarUID><!--相当于几级标题,我这个案例中项目是1,单体是2,安装单元是3--><OutlineLevel>1</OutlineLevel><!--具体层级,和word中的标题一样,1、1.1、1.1.1....--><OutlineNumber>1</OutlineNumber><!--要显示的名称--><Name>项目名称1</Name><!--开始时间--><Start>-07-03T09:00:00</Start><!--结束时间--><Finish>-08-04T09:00:00</Finish></Task><Task><ID>2</ID><UID>2</UID><CalendarUID>-1</CalendarUID><OutlineLevel>2</OutlineLevel><OutlineNumber>1.1</OutlineNumber><Name>单体1</Name><Start>-07-20T09:00:00</Start><Finish>-08-04T09:00:00</Finish></Task><Task><ID>3</ID><UID>3</UID><CalendarUID>-1</CalendarUID><OutlineLevel>3</OutlineLevel><OutlineNumber>1.1.1</OutlineNumber><Name>安装单元1</Name><!--最后一级需要写这个属性--><Type>1</Type><!--最后一级需要写这个属性,数字为结束时间-开始时间天数*8--><RemainingDuration>PT48H0M0S</RemainingDuration><!--最后一级需要写这个属性,从哪天开始--><ConstraintDate>-07-20T09:00:00</ConstraintDate><Start>-07-20T09:00:00</Start><Finish>-07-26T09:00:00</Finish></Task><Task><ID>4</ID><UID>4</UID><CalendarUID>-1</CalendarUID><OutlineLevel>3</OutlineLevel><OutlineNumber>1.1.2</OutlineNumber><Name>安装单元2</Name><Type>1</Type><RemainingDuration>PT32H0M0S</RemainingDuration><ConstraintDate>-07-26T09:00:00</ConstraintDate><!--有前置任务的需要写这个属性数字为结束时间-开始时间天数*8,和RemainingDuration标签值一样--><Duration>PT32H0M0S</Duration><!--前置任务,可以有多个--><PredecessorLink><!--前置任务的task标签下的UID标签的值--><PredecessorUID>3</PredecessorUID><Type>1</Type><LagFormat>7</LagFormat></PredecessorLink><Start>-07-26T09:00:00</Start><Finish>-07-30T09:00:00</Finish></Task><Task><ID>5</ID><UID>5</UID><CalendarUID>-1</CalendarUID><OutlineLevel>3</OutlineLevel><OutlineNumber>1.1.3</OutlineNumber><Name>安装单元3</Name><Type>1</Type><RemainingDuration>PT40H0M0S</RemainingDuration><ConstraintDate>-07-30T09:00:00</ConstraintDate><Duration>PT40H0M0S</Duration><PredecessorLink><PredecessorUID>3</PredecessorUID><Type>1</Type><LagFormat>7</LagFormat></PredecessorLink><PredecessorLink><PredecessorUID>4</PredecessorUID><Type>1</Type><LagFormat>7</LagFormat></PredecessorLink><Start>-07-30T09:00:00</Start><Finish>-08-04T09:00:00</Finish></Task><Task><ID>6</ID><UID>6</UID><CalendarUID>-1</CalendarUID><OutlineLevel>2</OutlineLevel><OutlineNumber>1.2</OutlineNumber><Name>单体2</Name><Start>-07-03T09:00:00</Start><Finish>-07-23T09:00:00</Finish></Task><Task><ID>7</ID><UID>7</UID><CalendarUID>-1</CalendarUID><OutlineLevel>3</OutlineLevel><OutlineNumber>1.2.4</OutlineNumber><Name>安装单元1</Name><Type>1</Type><RemainingDuration>PT80H0M0S</RemainingDuration><ConstraintDate>-07-03T09:00:00</ConstraintDate><Start>-07-03T09:00:00</Start><Finish>-07-13T09:00:00</Finish></Task><Task><ID>8</ID><UID>8</UID><CalendarUID>-1</CalendarUID><OutlineLevel>3</OutlineLevel><OutlineNumber>1.2.5</OutlineNumber><Name>安装单元2</Name><Type>1</Type><RemainingDuration>PT24H0M0S</RemainingDuration><ConstraintDate>-07-13T09:00:00</ConstraintDate><Duration>PT24H0M0S</Duration><PredecessorLink><PredecessorUID>7</PredecessorUID><Type>1</Type><LagFormat>7</LagFormat></PredecessorLink><Start>-07-13T09:00:00</Start><Finish>-07-16T09:00:00</Finish></Task><Task><ID>9</ID><UID>9</UID><CalendarUID>-1</CalendarUID><OutlineLevel>3</OutlineLevel><OutlineNumber>1.2.6</OutlineNumber><Name>安装单元3</Name><Type>1</Type><RemainingDuration>PT32H0M0S</RemainingDuration><ConstraintDate>-07-16T09:00:00</ConstraintDate><Duration>PT32H0M0S</Duration><PredecessorLink><PredecessorUID>7</PredecessorUID><Type>1</Type><LagFormat>7</LagFormat></PredecessorLink><PredecessorLink><PredecessorUID>8</PredecessorUID><Type>1</Type><LagFormat>7</LagFormat></PredecessorLink><Start>-07-16T09:00:00</Start><Finish>-07-20T09:00:00</Finish></Task><Task><ID>10</ID><UID>10</UID><CalendarUID>-1</CalendarUID><OutlineLevel>3</OutlineLevel><OutlineNumber>1.2.7</OutlineNumber><Name>安装单元4</Name><Type>1</Type><RemainingDuration>PT24H0M0S</RemainingDuration><ConstraintDate>-07-20T09:00:00</ConstraintDate><Duration>PT24H0M0S</Duration><PredecessorLink><PredecessorUID>7</PredecessorUID><Type>1</Type><LagFormat>7</LagFormat></PredecessorLink><PredecessorLink><PredecessorUID>8</PredecessorUID><Type>1</Type><LagFormat>7</LagFormat></PredecessorLink><PredecessorLink><PredecessorUID>9</PredecessorUID><Type>1</Type><LagFormat>7</LagFormat></PredecessorLink><Start>-07-20T09:00:00</Start><Finish>-07-23T09:00:00</Finish></Task><Task><ID>11</ID><UID>11</UID><CalendarUID>-1</CalendarUID><OutlineLevel>2</OutlineLevel><OutlineNumber>1.3</OutlineNumber><Name>单体3</Name><Start>-07-10T09:00:00</Start><Finish>-07-23T09:00:00</Finish></Task><Task><ID>12</ID><UID>12</UID><CalendarUID>-1</CalendarUID><OutlineLevel>3</OutlineLevel><OutlineNumber>1.3.8</OutlineNumber><Name>安装单元1</Name><Type>1</Type><RemainingDuration>PT24H0M0S</RemainingDuration><ConstraintDate>-07-10T09:00:00</ConstraintDate><Start>-07-10T09:00:00</Start><Finish>-07-13T09:00:00</Finish></Task><Task><ID>13</ID><UID>13</UID><CalendarUID>-1</CalendarUID><OutlineLevel>3</OutlineLevel><OutlineNumber>1.3.9</OutlineNumber><Name>安装单元2</Name><Type>1</Type><RemainingDuration>PT80H0M0S</RemainingDuration><ConstraintDate>-07-13T09:00:00</ConstraintDate><Duration>PT80H0M0S</Duration><PredecessorLink><PredecessorUID>12</PredecessorUID><Type>1</Type><LagFormat>7</LagFormat></PredecessorLink><Start>-07-13T09:00:00</Start><Finish>-07-23T09:00:00</Finish></Task></Tasks><!--这个是显示右边的图形的,拿我这个案例举例,有几个安装单元就有几个Assignment标签--><Assignments><Assignment><!--应该是不重复就可以--><UID>3</UID><!--task标签下的UID的值--><TaskUID>3</TaskUID><Start>-07-20T09:00:00</Start><Finish>-07-26T09:00:00</Finish><!--每一天--><TimephasedData><!--task标签下的UID的值--><UID>3</UID><!--开始时间和结束时间,按天来的就这么写--><Start>-07-20T09:00:00</Start><Finish>-07-21T09:00:00</Finish></TimephasedData><TimephasedData><UID>3</UID><Start>-07-21T09:00:00</Start><Finish>-07-22T09:00:00</Finish></TimephasedData><TimephasedData><UID>3</UID><Start>-07-22T09:00:00</Start><Finish>-07-23T09:00:00</Finish></TimephasedData><TimephasedData><UID>3</UID><Start>-07-23T09:00:00</Start><Finish>-07-24T09:00:00</Finish></TimephasedData><TimephasedData><UID>3</UID><Start>-07-24T09:00:00</Start><Finish>-07-25T09:00:00</Finish></TimephasedData><TimephasedData><UID>3</UID><Start>-07-25T09:00:00</Start><Finish>-07-26T09:00:00</Finish></TimephasedData></Assignment><Assignment><UID>4</UID><TaskUID>4</TaskUID><Start>-07-26T09:00:00</Start><Finish>-07-30T09:00:00</Finish><TimephasedData><UID>4</UID><Start>-07-26T09:00:00</Start><Finish>-07-27T09:00:00</Finish></TimephasedData><TimephasedData><UID>4</UID><Start>-07-27T09:00:00</Start><Finish>-07-28T09:00:00</Finish></TimephasedData><TimephasedData><UID>4</UID><Start>-07-28T09:00:00</Start><Finish>-07-29T09:00:00</Finish></TimephasedData><TimephasedData><UID>4</UID><Start>-07-29T09:00:00</Start><Finish>-07-30T09:00:00</Finish></TimephasedData></Assignment><Assignment><UID>5</UID><TaskUID>5</TaskUID><Start>-07-30T09:00:00</Start><Finish>-08-04T09:00:00</Finish><TimephasedData><UID>5</UID><Start>-07-30T09:00:00</Start><Finish>-07-31T09:00:00</Finish></TimephasedData><TimephasedData><UID>5</UID><Start>-07-31T09:00:00</Start><Finish>-08-01T09:00:00</Finish></TimephasedData><TimephasedData><UID>5</UID><Start>-08-01T09:00:00</Start><Finish>-08-02T09:00:00</Finish></TimephasedData><TimephasedData><UID>5</UID><Start>-08-02T09:00:00</Start><Finish>-08-03T09:00:00</Finish></TimephasedData><TimephasedData><UID>5</UID><Start>-08-03T09:00:00</Start><Finish>-08-04T09:00:00</Finish></TimephasedData></Assignment><Assignment><UID>7</UID><TaskUID>7</TaskUID><Start>-07-03T09:00:00</Start><Finish>-07-13T09:00:00</Finish><TimephasedData><UID>7</UID><Start>-07-03T09:00:00</Start><Finish>-07-04T09:00:00</Finish></TimephasedData><TimephasedData><UID>7</UID><Start>-07-04T09:00:00</Start><Finish>-07-05T09:00:00</Finish></TimephasedData><TimephasedData><UID>7</UID><Start>-07-05T09:00:00</Start><Finish>-07-06T09:00:00</Finish></TimephasedData><TimephasedData><UID>7</UID><Start>-07-06T09:00:00</Start><Finish>-07-07T09:00:00</Finish></TimephasedData><TimephasedData><UID>7</UID><Start>-07-07T09:00:00</Start><Finish>-07-08T09:00:00</Finish></TimephasedData><TimephasedData><UID>7</UID><Start>-07-08T09:00:00</Start><Finish>-07-09T09:00:00</Finish></TimephasedData><TimephasedData><UID>7</UID><Start>-07-09T09:00:00</Start><Finish>-07-10T09:00:00</Finish></TimephasedData><TimephasedData><UID>7</UID><Start>-07-10T09:00:00</Start><Finish>-07-11T09:00:00</Finish></TimephasedData><TimephasedData><UID>7</UID><Start>-07-11T09:00:00</Start><Finish>-07-12T09:00:00</Finish></TimephasedData><TimephasedData><UID>7</UID><Start>-07-12T09:00:00</Start><Finish>-07-13T09:00:00</Finish></TimephasedData></Assignment><Assignment><UID>8</UID><TaskUID>8</TaskUID><Start>-07-13T09:00:00</Start><Finish>-07-16T09:00:00</Finish><TimephasedData><UID>8</UID><Start>-07-13T09:00:00</Start><Finish>-07-14T09:00:00</Finish></TimephasedData><TimephasedData><UID>8</UID><Start>-07-14T09:00:00</Start><Finish>-07-15T09:00:00</Finish></TimephasedData><TimephasedData><UID>8</UID><Start>-07-15T09:00:00</Start><Finish>-07-16T09:00:00</Finish></TimephasedData></Assignment><Assignment><UID>9</UID><TaskUID>9</TaskUID><Start>-07-16T09:00:00</Start><Finish>-07-20T09:00:00</Finish><TimephasedData><UID>9</UID><Start>-07-16T09:00:00</Start><Finish>-07-17T09:00:00</Finish></TimephasedData><TimephasedData><UID>9</UID><Start>-07-17T09:00:00</Start><Finish>-07-18T09:00:00</Finish></TimephasedData><TimephasedData><UID>9</UID><Start>-07-18T09:00:00</Start><Finish>-07-19T09:00:00</Finish></TimephasedData><TimephasedData><UID>9</UID><Start>-07-19T09:00:00</Start><Finish>-07-20T09:00:00</Finish></TimephasedData></Assignment><Assignment><UID>10</UID><TaskUID>10</TaskUID><Start>-07-20T09:00:00</Start><Finish>-07-23T09:00:00</Finish><TimephasedData><UID>10</UID><Start>-07-20T09:00:00</Start><Finish>-07-21T09:00:00</Finish></TimephasedData><TimephasedData><UID>10</UID><Start>-07-21T09:00:00</Start><Finish>-07-22T09:00:00</Finish></TimephasedData><TimephasedData><UID>10</UID><Start>-07-22T09:00:00</Start><Finish>-07-23T09:00:00</Finish></TimephasedData></Assignment><Assignment><UID>12</UID><TaskUID>12</TaskUID><Start>-07-10T09:00:00</Start><Finish>-07-13T09:00:00</Finish><TimephasedData><UID>12</UID><Start>-07-10T09:00:00</Start><Finish>-07-11T09:00:00</Finish></TimephasedData><TimephasedData><UID>12</UID><Start>-07-11T09:00:00</Start><Finish>-07-12T09:00:00</Finish></TimephasedData><TimephasedData><UID>12</UID><Start>-07-12T09:00:00</Start><Finish>-07-13T09:00:00</Finish></TimephasedData></Assignment><Assignment><UID>13</UID><TaskUID>13</TaskUID><Start>-07-13T09:00:00</Start><Finish>-07-23T09:00:00</Finish><TimephasedData><UID>13</UID><Start>-07-13T09:00:00</Start><Finish>-07-14T09:00:00</Finish></TimephasedData><TimephasedData><UID>13</UID><Start>-07-14T09:00:00</Start><Finish>-07-15T09:00:00</Finish></TimephasedData><TimephasedData><UID>13</UID><Start>-07-15T09:00:00</Start><Finish>-07-16T09:00:00</Finish></TimephasedData><TimephasedData><UID>13</UID><Start>-07-16T09:00:00</Start><Finish>-07-17T09:00:00</Finish></TimephasedData><TimephasedData><UID>13</UID><Start>-07-17T09:00:00</Start><Finish>-07-18T09:00:00</Finish></TimephasedData><TimephasedData><UID>13</UID><Start>-07-18T09:00:00</Start><Finish>-07-19T09:00:00</Finish></TimephasedData><TimephasedData><UID>13</UID><Start>-07-19T09:00:00</Start><Finish>-07-20T09:00:00</Finish></TimephasedData><TimephasedData><UID>13</UID><Start>-07-20T09:00:00</Start><Finish>-07-21T09:00:00</Finish></TimephasedData><TimephasedData><UID>13</UID><Start>-07-21T09:00:00</Start><Finish>-07-22T09:00:00</Finish></TimephasedData><TimephasedData><UID>13</UID><Start>-07-22T09:00:00</Start><Finish>-07-23T09:00:00</Finish></TimephasedData></Assignment></Assignments></Project>

代码:

public class GenerateGanttProjectXml {// 创建数据public static ProjectEntity generateData() {List<UnitEntity> unitEntityList = new ArrayList<>();UnitEntity unitEntity = new UnitEntity("单体1", "安装单元1", "", LocalDate.parse("-07-20"), LocalDate.parse("-07-26"));unitEntityList.add(unitEntity);unitEntity = new UnitEntity("单体1", "安装单元2", "安装单元1", LocalDate.parse("-07-26"), LocalDate.parse("-07-30"));unitEntityList.add(unitEntity);unitEntity = new UnitEntity("单体1", "安装单元3", "安装单元1,安装单元2", LocalDate.parse("-07-30"), LocalDate.parse("-08-04"));unitEntityList.add(unitEntity);unitEntity = new UnitEntity("单体2", "安装单元1", "",LocalDate.parse("-07-03"), LocalDate.parse("-07-13"));unitEntityList.add(unitEntity);unitEntity = new UnitEntity("单体2", "安装单元2", "安装单元1",LocalDate.parse("-07-13"), LocalDate.parse("-07-16"));unitEntityList.add(unitEntity);unitEntity = new UnitEntity("单体2", "安装单元3", "安装单元1,安装单元2",LocalDate.parse("-07-16"), LocalDate.parse("-07-20"));unitEntityList.add(unitEntity);unitEntity = new UnitEntity("单体2", "安装单元4", "安装单元1,安装单元2,安装单元3",LocalDate.parse("-07-20"), LocalDate.parse("-07-23"));unitEntityList.add(unitEntity);unitEntity = new UnitEntity("单体3", "安装单元1", "",LocalDate.parse("-07-10"), LocalDate.parse("-07-13"));unitEntityList.add(unitEntity);unitEntity = new UnitEntity("单体3", "安装单元2", "安装单元1",LocalDate.parse("-07-13"), LocalDate.parse("-07-23"));unitEntityList.add(unitEntity);ProjectEntity projectEntity = new ProjectEntity("项目编号1", "项目名称1", "合同编号1", "项目经理1", LocalDate.parse("-09-23"), unitEntityList);//给项目的开始时间和结束时间赋值LocalDate minDate = projectEntity.getEntityList().get(0).getStartTime();LocalDate maxDate = projectEntity.getEntityList().get(0).getEndTime();for (int i = 0; i < projectEntity.getEntityList().size(); i ++) {if (projectEntity.getEntityList().get(i).getStartTime().isBefore(minDate)) {minDate = projectEntity.getEntityList().get(i).getStartTime();}if (projectEntity.getEntityList().get(i).getEndTime().isAfter(maxDate)) {maxDate = projectEntity.getEntityList().get(i).getEndTime();}}projectEntity.setStartTime(minDate);projectEntity.setEndTime(maxDate);// 给单体的开始时间和结束时间赋值int insertIndex = 0;int toIndex = 0;LocalDate minDate2 = null;LocalDate maxDate2 = null;if (projectEntity.getEntityList().size() == 1) {UnitEntity unitEntity2 = new UnitEntity(projectEntity.getEntityList().get(0).getSingleBodyName(), "", "",projectEntity.getEntityList().get(0).getStartTime(), projectEntity.getEntityList().get(0).getEndTime());projectEntity.getEntityList().add(0, unitEntity2);} else {for (int i = 0; i < projectEntity.getEntityList().size() - 1; i++) {//获取第0列和第1列每行单元格的 值 如果相等 将合并列的数量加一String name1 = projectEntity.getEntityList().get(i).getSingleBodyName();String name2 = projectEntity.getEntityList().get(i + 1).getSingleBodyName();if (name2.equals(name1)) {toIndex ++;} else {// 获取最大日期和最小日期//循环数据 获取最大日期和最小日期并得到天数查minDate2 = projectEntity.getEntityList().get(insertIndex).getStartTime();maxDate2 = projectEntity.getEntityList().get(toIndex).getEndTime();for (int j = insertIndex; j < toIndex; j++ ) {if (projectEntity.getEntityList().get(i).getStartTime().isBefore(minDate2)) {minDate2 = projectEntity.getEntityList().get(i).getStartTime();}if (projectEntity.getEntityList().get(i).getEndTime().isAfter(maxDate2)) {maxDate2 = projectEntity.getEntityList().get(i).getEndTime();}}UnitEntity unitEntity2 = new UnitEntity(projectEntity.getEntityList().get(i).getSingleBodyName(), "", "", minDate2, maxDate2);projectEntity.getEntityList().add(insertIndex, unitEntity2);i++;insertIndex = i + 1;toIndex = i + 1;}if (i == projectEntity.getEntityList().size() - 2) {minDate2 = projectEntity.getEntityList().get(insertIndex).getStartTime();maxDate2 = projectEntity.getEntityList().get(toIndex).getEndTime();for (int j = insertIndex; j < toIndex; j++ ) {if (projectEntity.getEntityList().get(i).getStartTime().isBefore(minDate2)) {minDate2 = projectEntity.getEntityList().get(i).getStartTime();}if (projectEntity.getEntityList().get(i).getEndTime().isAfter(maxDate2)) {maxDate2 = projectEntity.getEntityList().get(i).getEndTime();}}UnitEntity unitEntity2 = new UnitEntity(projectEntity.getEntityList().get(i).getSingleBodyName(), "", "", minDate2, maxDate2);projectEntity.getEntityList().add(insertIndex, unitEntity2);break;}}}UnitEntity unitEntity2 = new UnitEntity(projectEntity.getProjectName(), "", "", projectEntity.getStartTime(), projectEntity.getEndTime());projectEntity.getEntityList().add(0, unitEntity2);return projectEntity;}public static void generateXml(ProjectEntity projectEntity, String localXmlPath) {String xmlName = "甘特图2.xml";String xmlTitle = "计划更新甘特图";String xmlCalendarUID = "3";try {// 创建解析器工厂DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder db = factory.newDocumentBuilder();Document document = db.newDocument();document.setXmlStandalone(true);Element project = document.createElement("Project");project.setAttribute("xmlns", "/project");// <Name>Element name = document.createElement("Name");name.setTextContent(xmlName);project.appendChild(name);//<Title>Element title = document.createElement("Title");title.setTextContent(xmlTitle);project.appendChild(title);// <ScheduleFromStart>Element scheduleFromStart = document.createElement("ScheduleFromStart");scheduleFromStart.setTextContent(xmlCalendarUID);project.appendChild(scheduleFromStart);// <StartDate>Element startDate = document.createElement("StartDate");startDate.setTextContent(projectEntity.getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + "T09:00:00");project.appendChild(startDate);// <FinishDate>Element finishDate = document.createElement("FinishDate");finishDate.setTextContent(projectEntity.getEndTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + "T09:00:00");project.appendChild(finishDate);// <CalendarUID>Element calendarUID = document.createElement("CalendarUID");calendarUID.setTextContent(xmlCalendarUID);project.appendChild(calendarUID);//创建日历Element calendars = createCalendarsElement(document);project.appendChild(calendars);//创建任务Element tasks = createTasksElement(document, projectEntity);project.appendChild(tasks);// 创建AssignmentsElement assignments = createAssignmentsElement(document, projectEntity);project.appendChild(assignments);document.appendChild(project);TransformerFactory tff = TransformerFactory.newInstance();Transformer tf = tff.newTransformer();// 输出内容是否使用换行tf.setOutputProperty(OutputKeys.INDENT, "yes");// 创建xml文件并写入内容tf.transform(new DOMSource(document), new StreamResult(new File(localXmlPath)));System.out.println("生成xml成功");} catch (Exception e) {e.printStackTrace();System.out.println("生成xml失败");}}public static Element createCalendarsElement(Document document) {Element calendars = document.createElement("Calendars");Element calendar = document.createElement("Calendar");calendars.appendChild(calendar);// <UID>Element UID = document.createElement("UID");UID.setTextContent("3");calendar.appendChild(UID);// <Name>Element name = document.createElement("Name");name.setTextContent("全年无休");calendar.appendChild(name);// <BaseCalendarUID>Element baseCalendarUID = document.createElement("BaseCalendarUID");baseCalendarUID.setTextContent("-1");calendar.appendChild(baseCalendarUID);// <WeekDays>Element weekDays = document.createElement("WeekDays");calendar.appendChild(weekDays);// <WeekDay>Element weekDay = null;for (int i = 1; i <= 7; i ++) {weekDay = document.createElement("WeekDay");weekDays.appendChild(weekDay);// <DayType>Element dayType = document.createElement("DayType");dayType.setTextContent(i + "");weekDay.appendChild(dayType);// <DayWorking>Element dayWorking = document.createElement("DayWorking");dayWorking.setTextContent("1");weekDay.appendChild(dayWorking);// <WorkingTimes>Element workingTimes = document.createElement("WorkingTimes");weekDay.appendChild(workingTimes);// <WorkingTime>Element workingTime = null;Element fromTime = null;Element toTime = null;for (int j = 1; j <= 2; j ++) {workingTime = document.createElement("WorkingTime");workingTimes.appendChild(workingTime);if (j == 1) {// <FromTime>fromTime = document.createElement("FromTime");fromTime.setTextContent("08:00:00");workingTime.appendChild(fromTime);// <ToTime>toTime = document.createElement("ToTime");toTime.setTextContent("12:00:00");workingTime.appendChild(toTime);} else {// <FromTime>fromTime = document.createElement("FromTime");fromTime.setTextContent("13:00:00");workingTime.appendChild(fromTime);// <ToTime>toTime = document.createElement("ToTime");toTime.setTextContent("17:00:00");workingTime.appendChild(toTime);}}}return calendars;}public static Element createTasksElement(Document document, ProjectEntity projectEntity) {Element tasks = document.createElement("Tasks");//taskElement task = null;Element id = null;Element uid = null;Element calendarUID = null;Element outlineLevel = null;Element outlineNumber = null;Element start = null;Element finish = null;Element name = null;Element type = null;Element remainingDuration = null;Element predecessorLink = null;Element predecessorUID = null;Element type2 = null;Element lagFormat = null;Element constraintDate = null;Element duration = null;List<UnitEntity> unitEntityList = projectEntity.getEntityList();String calendarUIDValue = "-1";int projectNum = 0;int monomerNum = 0;int unitNum = 0;int preBegin = 0;for (int i = 0; i < unitEntityList.size(); i ++) {task = document.createElement("Task");id = document.createElement("ID");id.setTextContent(i + 1 + "");task.appendChild(id);uid = document.createElement("UID");uid.setTextContent(i + 1 + "");task.appendChild(uid);calendarUID = document.createElement("CalendarUID");calendarUID.setTextContent(calendarUIDValue);task.appendChild(calendarUID);// OutlineLevel// 如果是项目(第一条是项目)值为1 单体(安装单元编号为空是单体)值为2 安装单元值为2String outlineLevelValue = null;outlineLevel = document.createElement("OutlineLevel");if (i == 0) {outlineLevelValue = "1";projectNum ++;} else if (unitEntityList.get(i).getUnitCode() == null || "".equals(unitEntityList.get(i).getUnitCode())) {outlineLevelValue = "2";monomerNum ++;preBegin = i;} else {outlineLevelValue = "3";unitNum ++;}outlineLevel.setTextContent(outlineLevelValue);task.appendChild(outlineLevel);// OutlineNumber// 级别编号 需计算outlineNumber = document.createElement("OutlineNumber");String outlineNumberValue = "";if ("1".equals(outlineLevelValue)) {outlineNumberValue = projectNum + "";} else if ("2".equals(outlineLevelValue)) {outlineNumberValue = projectNum + "." + monomerNum;} else {outlineNumberValue = projectNum + "." + monomerNum + "." + unitNum;}outlineNumber.setTextContent(outlineNumberValue);task.appendChild(outlineNumber);name = document.createElement("Name");String nameValue = "";if ("1".equals(outlineLevelValue)) {nameValue = unitEntityList.get(i).getSingleBodyName();} else if ("2".equals(outlineLevelValue)) {nameValue = unitEntityList.get(i).getSingleBodyName();} else {nameValue = unitEntityList.get(i).getUnitCode();}name.setTextContent(nameValue);task.appendChild(name);if ("3".equals(outlineLevelValue)) {type = document.createElement("Type");type.setTextContent("1");task.appendChild(type);//获取日期差LocalDate minDate = unitEntityList.get(i).getStartTime();LocalDate maxDate = unitEntityList.get(i).getEndTime();int dayDiff = (int) (maxDate.toEpochDay()-minDate.toEpochDay());int remainingDurationValue = dayDiff * 8;String remainingDurationStrValue = "PT" + remainingDurationValue + "H0M0S";remainingDuration = document.createElement("RemainingDuration");remainingDuration.setTextContent(remainingDurationStrValue);task.appendChild(remainingDuration);constraintDate = document.createElement("ConstraintDate");constraintDate.setTextContent(unitEntityList.get(i).getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + "T09:00:00");task.appendChild(constraintDate);//如果有前置任务if (unitEntityList.get(i).getPreUnitCodes() != null && !"".equals(unitEntityList.get(i).getPreUnitCodes())) {duration = document.createElement("Duration");duration.setTextContent(remainingDurationStrValue);task.appendChild(duration);// 根据安装单元编码 获取前置任务的UIDString[] preScheduleNames = unitEntityList.get(i).getPreUnitCodes().split(",");String[] preUIDS = new String[preScheduleNames.length];for (int m = 0; m < preScheduleNames.length; m ++) {for (int n = preBegin; n < i; n ++) {// 如果前面的安装单元编码和前置任务中的安装编码相同if (unitEntityList.get(n).getUnitCode().equals(preScheduleNames[m])) {preUIDS[m] = n + 1 + "";break;}}}for (int m = 0; m < preScheduleNames.length; m ++) {predecessorLink = document.createElement("PredecessorLink");task.appendChild(predecessorLink);//前置任务的UIDpredecessorUID = document.createElement("PredecessorUID");predecessorUID.setTextContent(preUIDS[m]);predecessorLink.appendChild(predecessorUID);type2 = document.createElement("Type");type2.setTextContent("1");predecessorLink.appendChild(type2);lagFormat = document.createElement("LagFormat");lagFormat.setTextContent("7");predecessorLink.appendChild(lagFormat);}}}// <Start>start = document.createElement("Start");start.setTextContent(unitEntityList.get(i).getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + "T09:00:00");task.appendChild(start);// <Finish>finish = document.createElement("Finish");finish.setTextContent(unitEntityList.get(i).getEndTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + "T09:00:00");task.appendChild(finish);tasks.appendChild(task);}return tasks;}public static Element createAssignmentsElement(Document document, ProjectEntity projectEntity) {Element assignments = document.createElement("Assignments");Element assignment = null;Element UID = null;Element taskUID = null;Element start = null;Element finish = null;Element timephasedData = null;Element UID2 = null;Element start2 = null;Element finish2 = null;//获取安装单元所在列表的下标List<Integer> index = new ArrayList<>();List<UnitEntity> entityList = projectEntity.getEntityList();for (int i = 0; i < entityList.size(); i ++) {if (entityList.get(i).getUnitCode() != null && !"".equals(entityList.get(i).getUnitCode())) {assignment = document.createElement("Assignment");assignments.appendChild(assignment);UID = document.createElement("UID");UID.setTextContent(i + 1 + "");assignment.appendChild(UID);taskUID = document.createElement("TaskUID");taskUID.setTextContent(i + 1 + "");assignment.appendChild(taskUID);start = document.createElement("Start");start.setTextContent(entityList.get(i).getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + "T09:00:00");assignment.appendChild(start);finish = document.createElement("Finish");finish.setTextContent(entityList.get(i).getEndTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + "T09:00:00");assignment.appendChild(finish);//获取开始日期和结束日期时间差LocalDate minDate = entityList.get(i).getStartTime();LocalDate maxDate = entityList.get(i).getEndTime();int dayDiff = (int) (maxDate.toEpochDay()-minDate.toEpochDay());for(int j = 0; j < dayDiff; j ++) {timephasedData = document.createElement("TimephasedData");assignment.appendChild(timephasedData);UID2 = document.createElement("UID");UID2.setTextContent(i + 1 + "");timephasedData.appendChild(UID2);start2 = document.createElement("Start");start2.setTextContent(entityList.get(i).getStartTime().plusDays(j).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + "T09:00:00");timephasedData.appendChild(start2);finish2 = document.createElement("Finish");finish2.setTextContent(entityList.get(i).getStartTime().plusDays(j+1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + "T09:00:00");timephasedData.appendChild(finish2);}}}return assignments;}public static void main(String[] args) {// 获取数据ProjectEntity projectEntity = generateData();//生成xml文件String localXmlPath = "D:\\文件\\公司\\需求\\甘特图\\甘特图project.xml";generateXml(projectEntity, localXmlPath);}}

ProjectEntity类:

public class ProjectEntity {private String projectCode;private String projectName;private String contractCode;private String projectMaster;private LocalDate planCompleteTime;private List<UnitEntity> entityList;private String singleBodyName;private String unitCode;private String preUnitCodes;private LocalDate startTime;private LocalDate endTime;public ProjectEntity(String projectCode, String singleBodyName, String unitCode, LocalDate startTime, LocalDate endTime) {this.projectCode = projectCode;this.singleBodyName = singleBodyName;this.unitCode = unitCode;this.startTime = startTime;this.endTime = endTime;}public String getSingleBodyName() {return singleBodyName;}public void setSingleBodyName(String singleBodyName) {this.singleBodyName = singleBodyName;}public String getUnitCode() {return unitCode;}public void setUnitCode(String unitCode) {this.unitCode = unitCode;}public String getPreUnitCodes() {return preUnitCodes;}public void setPreUnitCodes(String preUnitCodes) {this.preUnitCodes = preUnitCodes;}public LocalDate getStartTime() {return startTime;}public void setStartTime(LocalDate startTime) {this.startTime = startTime;}public LocalDate getEndTime() {return endTime;}public void setEndTime(LocalDate endTime) {this.endTime = endTime;}public ProjectEntity(String projectCode, String projectName, String contractCode, String projectMaster, LocalDate planCompleteTime, List<UnitEntity> entityList) {this.projectCode = projectCode;this.projectName = projectName;this.contractCode = contractCode;this.projectMaster = projectMaster;this.planCompleteTime = planCompleteTime;this.entityList = entityList;}public String getProjectCode() {return projectCode;}public void setProjectCode(String projectCode) {this.projectCode = projectCode;}public String getProjectName() {return projectName;}public void setProjectName(String projectName) {this.projectName = projectName;}public String getContractCode() {return contractCode;}public void setContractCode(String contractCode) {this.contractCode = contractCode;}public String getProjectMaster() {return projectMaster;}public void setProjectMaster(String projectMaster) {this.projectMaster = projectMaster;}public LocalDate getPlanCompleteTime() {return planCompleteTime;}public void setPlanCompleteTime(LocalDate planCompleteTime) {this.planCompleteTime = planCompleteTime;}public List<UnitEntity> getEntityList() {return entityList;}public void setEntityList(List<UnitEntity> entityList) {this.entityList = entityList;}}

UnitEntity类:

public class UnitEntity {private String singleBodyName;private String unitCode;private String preUnitCodes;private LocalDate startTime;private LocalDate endTime;public UnitEntity(String singleBodyName, String unitCode, String preUnitCodes, LocalDate startTime, LocalDate endTime) {this.singleBodyName = singleBodyName;this.unitCode = unitCode;this.preUnitCodes = preUnitCodes;this.startTime = startTime;this.endTime = endTime;}public String getSingleBodyName() {return singleBodyName;}public void setSingleBodyName(String singleBodyName) {this.singleBodyName = singleBodyName;}public String getUnitCode() {return unitCode;}public void setUnitCode(String unitCode) {this.unitCode = unitCode;}public String getPreUnitCodes() {return preUnitCodes;}public void setPreUnitCodes(String preUnitCodes) {this.preUnitCodes = preUnitCodes;}public LocalDate getStartTime() {return startTime;}public void setStartTime(LocalDate startTime) {this.startTime = startTime;}public LocalDate getEndTime() {return endTime;}public void setEndTime(LocalDate endTime) {this.endTime = endTime;}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。