The killer is among the dead, police and prosecutors are reported as saying.
Shooting broke out in the canteen at the Kronospan wood processing plant in the town of Menznau at around 09:00.
Police and rescue services are at the scene and the entire area is currently sealed off.
“The workers were eating a snack in the cafeteria during the morning, and there was a massacre,” said a man quoted by the Swiss news website 20minutes, who had phoned the factory to check on the welfare of his father.
An emergency telephone line had been set up for families of the factory’s employees.
“There were three dead and seven injured, some of them seriously injured,” prosecutors’ spokesman Simon Kopp told Swiss newspaper Blick.
Switzerland has one of the highest rates of gun ownership in the world, but such gun attacks are relatively rare.
All healthy Swiss men aged between 18 and 34 are obliged to do military service and all are issued with assault rifles or pistols which they are supposed to keep at home.
Until recently, many kept their weapons even after completing their military service – though rules on this have recently been tightened.
According to the Geneva-based Small Arms Survey, Switzerland ranks third in terms of gun ownership, behind the United States and Yemen.
Street gun violence is very rare in Switzerland.
However, there are more domestic homicides and suicides with a firearm in Switzerland than virtually anywhere else in Europe except Finland.
hkWtHUlapFEImage source: Wikimedia Commons President-elect Donald Trump celebrated his election victory at the Ultimate Fighting…
Millions of voters across the US chose to return Donald Trump to the White House…
Donald Trump declares victory in the US election as he addresses jubilant supporters in Florida.…
Stocks around the world are rising as Donald Trump appears to be on the cusp…
Donald Trump has won Pennsylvania, North Carolina and Georgia and taken a lead over Kamala…
Quincy Jones, the celebrated musician and producer who worked with Michael Jackson, Frank Sinatra, Ray…